python框架Django中MTV之Model(数据模型)

网友投稿 318 2022-09-07


python框架Django中MTV之Model(数据模型)

MTV框架之Model(数据模型)

1、连接MySQL数据库

项目中的settings.py设置范例

# 配置数据库DATABASES = { 'default': { # 数据库引擎 'ENGINE': 'django.db.backends.mysql', # 数据库名称 'NAME': 'axf', # 账号和密码 'USER': 'root', 'PASSWORD': '123456', # IP和端口 'HOST': 'localhost', 'PORT': '3306' }}

项目中的init.py导入pymysql

import pymysqlpymysql.install_as_MySQLdb()

2、ORM

ObjectRelationalMapping=对象关系映射将具体语言下的【数据及其结构(通常以类表示)】映射为数据库的【表结构和数据】在Django中,一旦数据结构发生变化,就需要重新进行数据迁移

3、数据迁移操作

方法一:在Terminal窗口输入:

python manage.py makemigrations 生成数据迁移py文件python manage.py migrate 执行数据迁移

方法二、在工具栏Tools->Run manage.py Task…窗口输入:

makemigrations 生成数据迁移py文件migrate 执行数据迁移

4、数据定义

数据类型

整型:models.IntegerField(default=1)浮点型:models.FloatField(default=0)字符串: models.CharField(max_length=32, unique=True)长文本:models.TextField(db_column=‘ps’)

大文本字段,一般超过4000使用

布尔型:models.BooleanField(default=False)带空值布尔型:NullBooleanField

支持null、true、false三种值

日期时间:models.DateTimeField(auto_now=True)

使用Python的datetime.datetime实例表示的日期和时间若auto_now=True,每次保存对象时,自动设置该字段为当前时间若auto_now_add=True,当对象第一次被创建时自动设置当前时间(一次性的时间戳)注意:auto_now_add, auto_now,default三者是互斥的

其它字段类型

带小数点:DecimalField(max_digits=None, decimal_places=None)

使用python的Decimal实例表示的十进制浮点数max_digits=总位数decimal_places=小数位数

日期:DateField([auto_now=False, auto_now_add=False])

使用Python的datetime.date实例表示的日期

时间:TimeField

使用Python的datetime.time实例表示的时间

主键:a_id = models.AutoField(primary_key=True)

一个根据实际ID自动增长的IntegerField,通常不指定,如果不指定,一个主键字段将自动添加到模型中

文件:FileField

上传文件字段

图像:icon = models.ImageField(upload_to=‘icons’)

继承于FileField,框架对上传的对象进行校验,确保它是个有效的image

表关系字段(外键)

字段约束

primary_key=False

django会为表增加自动增长的主键列如果使用选项设置某属性为主键列后,则django不会再生成默认的主键列

max_length=Noneunique=Falsenull=False

如果为True,则默认以空值NULL填充

blank=False

如果为True,则该字段允许为空白(即空字符串),这个约束常常用于表单验证

default=NOT_PROVIDEDdb_index=False

若值为 True, 则在表中会为此字段创建索引

db_column=None

字段的名称,如果未指定,则使用属性的名称

完整约束源码​​class Field(RegisterLookupMixin): def __init__(self, verbose_name=None, name=None, primary_key=False, max_length=None, unique=False, blank=False, null=False, editable=True, serialize=True, unique_for_date=None, unique_for_month=None, unique_for_year=None, choices=None, help_text='', db_column=None, db_tablespace=None, auto_created=False, validators=(), error_messages=None): ​​​

元信息

class Meta:

db_table = ‘Flower’ #放在模型中,自定义生成的表名ordering = ["-f_color"] #放在模型中,对表进行默认排序

这是一个 tuple 或一个字符串列表. 每个字符串是一个字段名带及一个可选的前缀 “-” , 这个前缀表示按降序排序(递减). 若没有这个前缀,则表示按升序排序.字符串 “?” 表示随机排序.

范例:用户定义​​# 用户数据模型 class UserModel(models.Model): # 用户名密码邮箱 username = models.CharField(max_length=32, unique=True) password = models.CharField(max_length=256) email = models.CharField(max_length=64, unique=True) # False 代表女 sex = models.BooleanField(default=False) # 头像,图片字段,上传到静态资源文件夹下的icons/ icon = models.ImageField(upload_to='icons') # 是否被逻辑删除 is_delete = models.BooleanField(default=False) class Meta: #定义表名为t_user db_table = "t_user" ​​

5、数据查询

查询语法

XXX.objects.all()XXX.objects.get(k1=v1,k2=v2)过滤器

XXX.objects.filter(条件语句)XXX.objects.exclude(条件语句)

过滤器

filter(条件语句):获取符合条件的exclude(条件语句):去除不符合条件的

条件语句

格式

格式1:属性名=值(忽略大小写)格式2:属性名__运算符=临界值

运算符

gtltgteltestartswith

大小写敏感

endswithcontainsexactistartswith

i=忽略大小写

iendswithicontainsiexact

缓存的二次筛选

查询时允许多个过滤器串联使用(链式调用)只有第一次会执行数据库查询,后续操作是对已有结果集的筛选

Q对象:实现复杂条件

Q(条件语句) & Q(条件语句)

条件与

Q(条件语句) | Q(条件语句)

条件或

~ Q(条件语句)

条件非

6、表关系

7、Manager

显式属性/隐式属性

显式属性

开发者手动定义的,直接看的到的

隐式属性

系统/框架根据需求,自动创建的对象objects是model.Manager对象当我们手动创建了Manager对象的时候,它就不会自动生成了

好处:配置默认的数据创建方式和查询方式创建类并指定管理器​​class Dog(models.Model): d_name = models.CharField(max_length=16) d_legs = models.IntegerField(default=4) is_delete = models.BooleanField(default=False) # 交由管理器进行管理 d_manager = MyManager() ​​定义管理器类

class MyManager(models.Manager):定义创建实例方法​​ # 创建狗的实例,默认两条腿 def create_model(self,d_name, d_legs = 2): dog = self.model() dog.d_name = d_name dog.d_legs = d_legs return dog ​​定义查询方法​​ # 默认不包含被逻辑删除的狗狗 # 先调用model.Manager get_queryset def get_queryset(self): return super(MyManager,self).get_queryset().exclude(is_delete=True) ​​​

使用管理器类

创建实例

dog = Dog.d_manager.create_model(“中国田园犬”)

查询实例

dogs = Dog.d_manager.all()dogs = Dog.d_manager.all().filter(is_delete=False)dogs = Dog.d_manager.filter(d_legs__lt=100)dogs = Dog.d_manager.filter(Q(d_legs__lt=20)|Q(d_legs__gt=150))

8、继承

定义父类

案例:动物​​# 动物父类 class Animal(models.Model): #名字和腿数 a_name = models.CharField(max_length=16, default='Animal') a_legs = models.IntegerField(default=4) class Meta: #表名是抽象的,框架不会为当前类创建表 abstract = True ​​

定义子类

案例:狗狗​​# 动物子类狗狗 class Dog(Animal): #已经有了a_name和a_legs #定义自己独有的字段 d_fun = models.TextField() ​​

9、常用API

查询

flowers = Flower.objects.all()flowers = Flower.objects.all().order_by("-id")[0:2]flowers = Flower.objects.filter(f_color__gt=100).filter(f_color__lt=150)flowers = Flower.objects.filter(f_color__gt=100).exclude(f_color__gt=150).filter(f_name__contains=“水”)flowers = Flower.objects.filter(f_name__endswith=“1”)flowers = Flower.objects.filter(f_name=“rose”)flowers = Flower.objects.filter(pk__in=[1,2,3,4])flowers = Flower.objects.filter(f_time__year=“2019”)students = Student.objects.filter(s_grade_id__gt=F(‘id’)-5)----------flower = Flower.objects.get(pk=10)flower = Flower.objects.get(f_color=255)----------flower = flowers.last()flower = flowers.first()if flowers.count() == 0:if flowers.exists():----------dogs = Dog.objects.filter(~Q(d_legs__lt=100))

插入

grade = Grade()grade.g_name = ‘fuck’grade.save()----------person = Person.objects.create(p_name=“小黄%d”%random.randrange(110))p = Buyer.objects.create(b_name=“清醒%d下” % flag)goods = Goods.objects.create(g_name=“娃娃%d” % flag, g_price=flag)

删除

通过查询得到一个特定的grade对象grade.delete()

修改

通过查询得到一个特定的grade对象grade.gname=‘shit’grade.save()

后记

关注我,我们一起成长~~


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Django中间件(Middleware)处理请求(django 自定义中间件)
下一篇:python框架Django中的MTV架构(python django框架)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~