Django Model层的深入理解
一、字段
model中的每个类对应了数据库中的一张表,每个类的私有变量,对应数据库表中的字段。我们可以通过更改变量的一些设置来更改每个字段的类型、选项等信息。如:username = model.CharField(max_length=32) 表示 username的数据类型是varchar, 最大长度为32,不作为主键,未设置默认值,数据备注为’username’等。后面的信息虽然我们没有进行设置,但是Django已经为其准备了默认的属性。
常用的字段类型: CharField, TextField, IntegerField, DateField等
常用的字段选项:
-
null(如果True,字段为空时,值为NULL)
-
blank(如果为True, 表示允许空值, 与null不同在,blank是在表单提交的时候进行验证的)
-
default(设置默认取值)
-
max_length(最大长度)
-
choices (该参数接收一个可迭代的列表或元组(基本单位为二元组)。如果指定了该参数,在实例化该模型时,该字段只能取选项列表中的值。)
一个选项列表:
YEAR_IN_SCHOOL_CHOICES = ( ('FR', 'Freshman'), ('SO', 'Sophomore'), ('JR', 'Junior'), ('SR', 'Senior'), ('GR', 'Graduate'), )
每个二元组的第一个值会储存在数据库中,而第二个值将只会用于显示作用。
-
primary_key (为True, 设为主键,是否设为主键)
-
Unique (为True,不能重复,取值能否重复)
二、主键
Django默认会添加一个名为id的自增字段作为数据表的主键(相当于 id = model.AutoField(primary=True
) ), 但同时也支持自己定义其他的字段作为主键,参考上面代码的写法即可。所以,可以看出来建立表时必然是存在有主键的。
三、关联关系
即多对多、多对一、一对一三种关联关系。
-
多对一 (Many-to-one)
直接指定ForeignKey。如:class Manufacturer(models.Model): # ... pass class Car(models.Model): manufacturer = models.ForeignKey(Manufacturer, on_delete=models.CASCADE)
-
多对多 (many-to-many)
与多对一的写法是一样的:from django.db import models class Topping(models.Model): # ... pass class Pizza(models.Model): # ... toppings = models.ManyToManyField(Topping)
但是需要注意的是,多对多关系中,ManyToManyField只能出现一次,可以出现在相关联的两个表的任意表。
另外,允许设置额外字段(使用through参数来设置):
class Person(models.Model): name = models.CharField(max_length=128) def __str__(self): return self.name class Group(models.Model): name = models.CharField(max_length=128) members = models.ManyToManyField(Person, through='Membership') def __str__(self): return self.name class Membership(models.Model): person = models.ForeignKey(Person, on_delete=models.CASCADE) group = models.ForeignKey(Group, on_delete=models.CASCADE) date_joined = models.DateField() invite_reason = models.CharField(max_length=64)
-
一对一(one-to-one)
与上述两种的配置是基本相同的,官文里也没有例子,这里也不写了,如果工程中实际用到再加吧。
其他的点
- 特殊字段名 主要是不可以与关键字,Django提供的api的命名相冲突
- 跨文件模型 如zip文件
- 支持定义函数 如已知birthday可以通过计算得出用户的年龄,知道FirstName和FamilyName可以得到用户的FullName等,通过定义函数就可以实现这些功能。