模型是你的数据的唯一的、权威的信息源。
- django.db.models.Model 的一个Python 子类。
- 模型的每个属性都表示为数据库中的一个字段。
- Django 提供一套自动生成的用于数据库访问的API.
使用模型:appy应用后 manage.py makemigrations;manage.py migrate (表或表字段有更改时也需要做数据迁移)
字段:
字段类型:
字段类型
- AutoField:一个根据实际ID自动增长的IntegerField,通常不指定
- 如果不指定,一个主键字段将自动添加到模型中(用的时候为防止和自定义的ID冲突,可以用PK)
- BooleanField:true/false 字段,此字段的默认表单控制是CheckboxInput
- NullBooleanField:支持null、true、false三种值
- CharField(max_length=字符长度):字符串,默认的表单样式是 TextInput
- TextField:大文本字段,一般超过4000使用,默认的表单控件是Textarea
- IntegerField:整数
- DecimalField(max_digits=None, decimal_places=None):使用python的Decimal实例表示的十进制浮点数
- DecimalField.max_digits:位数总数
- DecimalField.decimal_places:小数点后的数字位数
- FloatField:用Python的float实例来表示的浮点数
- DateField[auto_now=False, auto_now_add=False]):使用Python的datetime.date实例表示的日期
- 参数DateField.auto_now:每次保存对象时,自动设置该字段为当前时间,用于"最后一次修改"的时间戳,它总是使用当前日期,默认为false
- 参数DateField.auto_now_add:当对象第一次被创建时自动设置当前时间,用于创建的时间戳,它总是使用当前日期,默认为false
- 该字段默认对应的表单控件是一个TextInput. 在管理员站点添加了一个JavaScript写的日历控件,和一个“Today"的快捷按钮,包含了一个额外的invalid_date错误消息键
- auto_now_add, auto_now, and default 这些设置是相互排斥的,他们之间的任何组合将会发生错误的结果
- TimeField:使用Python的datetime.time实例表示的时间,参数同DateField
- DateTimeField:使用Python的datetime.datetime实例表示的日期和时间,参数同DateField
- FileField:一个上传文件的字段
- ImageField:继承了FileField的所有属性和方法,但对上传的对象进行校验,确保它是个有效的image
字段选项:
通过字段选项,可以实现对字段的约束,在字段对象时通过关键字参数指定
- null:如果为True,Django 将空值以NULL 存储到数据库中,默认值是 False
- blank:如果为True,则该字段允许为空白,默认值是 False(django admin填充数据时允许为空)
- 对比:null是数据库范畴的概念,blank是表单验证证范畴的
- db_column:字段的名称,如果未指定,则使用属性的名称
- db_index:若值为 True, 则在表中会为此字段创建索引
- default:默认值
- primary_key:若为 True, 则该字段会成为模型的主键字段
- unique:如果为 True, 这个字段在表中必须有唯一值
- choices 它是一个可迭代的结构(比如,列表或是元组),由可迭代的二元组组成(比如[(A, B), (A, B)...]),用来给这个字段提供选择项。如果设置了 choices ,默认表格样式就会显示选择框,而不是标准的文本框,而且这个选择框的选项就是 choices 中的元组。每个元祖的第一个值做为select标签下option的value,第二个值为text显示文本。如果设置了choices,查询时想显示元祖第二哥元素时可用get_A_display()。
- 通过指定 key 来确认你要重写的错误信息。
- help_text 文本将被显示在表单控件form中
关系
ORM:objects relationship map 对象关系映射
表名(app名_表名)--------类名
字段--------属性
表记录--------类实例对象
关系的类型包括
- ForeignKey:一对多,将字段定义在多的端中
-
models.ForeignKey('self')。
- 来创建数据库中的列名
- 参数:
- related_name:用于让关联的对象反查到源对
- to_field:关联到的关联对象的字段名称
- db_constraint:控制是否在数据库中为这个外键创建约束。默认值为True,如果被设置成False,访问一个不存在的关联对象将抛出 DoesNotExist 异常。
- on_delete:当一个ForeignKey 引用的对象被删除时,Django 默认模拟SQL 的ON DELETE CASCADE 的约束行为,并且删除包含该ForeignKey的对象。 选项:CASCADE:级连删除,默认;PROTECT:抛出ProtectedError 以阻止被引用对象的删除。
-
- ManyToManyField:多对多,将字段定义在两端中
- 建议:不建议从一个没有迁移的应用中创建一个ManyToManyField到一个具有迁移的应用
- 数据库中的表示:默认情况下,会创建一张中间表,该表的名称使用多对多字段的名称和包含这张表的模型的名称生成,表名:app名_关联表1名_关联表2名,字段:自增主键,关联表1名_id,关联表2名_id
- 参数:
- related_name;
- through:through 选项来指定自己手动创建的第三张表
- through_field:指定表后可以指定字段
members = models.ManyToManyField(Person, through='Membership', through_fields=('group', 'person'))
- OneToOneField:一对一,将字段定义在任意一端中
元选项:
Meta 定义模型的元数据,可用的参数:
- ordering:对象默认的顺序,获取一个对象的列表时使用,符串前加-表示倒序,不加-表示正序
-
unique_togethe:联合主键;
-
verbose_name:对象的一个易于理解的名称,为单数;
示例
from django.db import models class Ox(models.Model): horn_length = models.IntegerField() class Meta: ordering = ['-order_date'] unique_together = ("driver", "restaurant")