字段和参数
常用字段
字段 | 说明 |
AutoField | int类型,自增列,必须填入参数primary_key=True. |
IntegerField | 整数类型,范围在 -2147483648 to 2147483647。 |
CharField | 字符串类型,必须提供max_length参数,表示字符长度。 |
DateField | 日期字段,格式 YYYY-MM-DD,相当于Python中的datetime.date()实例 |
DateTimeField | 日期时间字段,格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ],相当于Python中的datetime.datetime()实例。 |
字符合集
注意:model中没有设置自增列时,其会自动生成一个名为id的列。
自定义字段
class FixedCharField(models.Field): """ 自定义的char类型的字段类 """ def __init__(self, max_length, *args, **kwargs): self.max_length = max_length super(FixedCharField, self).__init__(max_length=max_length, *args, **kwargs) def db_type(self, connection): """ 限定生成数据库表的字段类型为char,长度为max_length指定的值 """ return 'char(%s)' % self.max_length # 自定义类的命名可以随意,需继承models.Field的属性 class Grader(models.Model): id = models.AutoField(primary_key=True) title = models.CharField(max_length=25) # 使用自定义的char类型的字段 cname = FixedCharField(max_length=25)
ORM字段与数据库中字段的对应关系
对应关系: 'AutoField': 'integer AUTO_INCREMENT', 'BigAutoField': 'bigint AUTO_INCREMENT', 'BinaryField': 'longblob', 'BooleanField': 'bool', 'CharField': 'varchar(%(max_length)s)', 'CommaSeparatedIntegerField': 'varchar(%(max_length)s)', 'DateField': 'date', 'DateTimeField': 'datetime', 'DecimalField': 'numeric(%(max_digits)s, %(decimal_places)s)', 'DurationField': 'bigint', 'FileField': 'varchar(%(max_length)s)', 'FilePathField': 'varchar(%(max_length)s)', 'FloatField': 'double precision', 'IntegerField': 'integer', 'BigIntegerField': 'bigint', 'IPAddressField': 'char(15)', 'GenericIPAddressField': 'char(39)', 'NullBooleanField': 'bool', 'OneToOneField': 'integer', 'PositiveIntegerField': 'integer UNSIGNED', 'PositiveSmallIntegerField': 'smallint UNSIGNED', 'SlugField': 'varchar(%(max_length)s)', 'SmallIntegerField': 'smallint', 'TextField': 'longtext', 'TimeField': 'time', 'UUIDField': 'char(32)',
字段参数
字段参数 | 说明 |
null | 表示某字段可为空 |
unique | 设置unique=True 则表示该字段在此表中必须是唯一的 |
db_index | 设置db_index=True 则代表着为此字段设置索引。 |
default | 设置默认值 |
DateField和DateTimeField相关参数
字段参数 | 说明 |
auto_now_add | 设置auto_now_add=True,创建数据记录时会把当前时间添加到数据库。 |
auto_now | 设置auto_now=True,数据每更新一次,该字段则更新一次,最终显示为最后更新时间。 |
关系字段
ForeignKey
建立外键约束,表示多对一或一对多关系,外键字段一般设置在关系中‘’多‘’的那一方。
字段参数
to:设置要关联的表
to_field:设置要关联的表的字段
示例
class Publisher(models.Model): id = models.AutoField(primary_key=True) name=models.CharField(max_length=32) class Book(models.Model): id=models.AutoField(primary_key=True) title=models.CharField(max_length=16) publisher=models.ForeignKey(to=Publisher,to_field=id)
on_delete
删除关联表中的数据时,当前表与其关联的行的变化
参数设置 | 说明 |
on_delete=models.CASCADE | 删除关联数据,关联关系也删除 |
on_delete=models.DO_NOTHING | 删除关联数据,引发错误IntegrityError |
on_delete=models.PROTECT | 删除关联数据,引发错误ProtectedError |
on_delete=models.SET_NULL | 删除关联数据,与之关联的值设置为null(外键字段设置可为空的前提下) |
on_delete=models.SET_DEFAULT | 删除关联数据,与之关联的值设置为默认值(外键字段设置了默认值的前提下) |
on_delete=models.SET | 删除关联数据,设置与之关联的值,设置见下 |
model.SET值的设置
1、设置指定值:model.SET(value)
2、设置可执行对象的返回值:model.SET(可执行对象)
def func(): return 10 class MyModel(models.Model): user = models.ForeignKey( to="User", to_field="id", on_delete=models.SET(func) ) # MyModel表关联到User表。
db_constraint:设置是否在数据库中创建外键约束,默认为True。
OneToOneField
建立表与表的一对一关系。一对一关系的两张表也可以合二为一。
class User(models.Model): name = models.CharField(max_length=16) gender_choice = ((1, "男"), (2, "女"), (3, "保密")) gender = models.SmallIntegerField(choices=gender_choice, default=3) detail = models.OneToOneField(to='UserInfo') class UserInfo(models.Model): phone = CharField(max_length=16, unique=True, db_index=True) addr = models.TextField() married = models.BooleanField() # 此2张表记录的是同一个人的信息,常用信息和其他信息分别放于2张表中,可以避免放于一张表中信息繁冗,降低检索速率。
字段参数
参数 | 说明 |
to | 设置要关联的表 |
to_field | 设置要关联的字段 |
on_delete | 同上foreignkey字段 |
ManyToManyField
建立两张表的多对多关系
字段参数
to:设置要关联的表
db_table:自动生成第3张表时,用此来设置该表的默认名称
through:手动生成第3张表时,多对多关系的建立通过throng指定第3张表。
through_fields:手动生成第3张表时,多对多关系的建立通过throng_fields指定有多对多关系的2张表。
class Book(models.Model): title = models.CharField(max_length=32) class Author(models.Model): name = models.CharField(max_length=32) # books = models.ManyToManyField( to="Book", through="Book2Author", through_fields=('author', 'book') ) # 自己创建第三张表 class Book2Author(models.Model): id = models.AutoField(primary_key=True) book = models.ForeignKey(to=Book) author = models.ForeignKey(to=Author) first_blood = models.DateField()
元信息
ORM对应的类中包含元类(Meta类),Meta类中封装的数据库信息如下
db_table | ORM中创建的数据库名默认为app_类名,可以用此来设置数据库的命名 |
index_together | 联合索引 |
unique_together | 联合唯一索引 |
ordering | 指定默认按某字段排序 |
class Author(models.Model): name = models.CharField(max_length=32) books = models.ManyToManyField(to="Book", db_table="author2book") class Meta: db_table = "author" # 设置命名后ORM生成的数据库名称为指定名称。