目录
多对一 (ForeignKey)
通常被称为外键.
外键字段类的定义 :
class ForeignKey(to, on_delete, **options)
- 外键需要两个位置参数, 一个是关联的模型, 另一个是on_delete
- 外键要定义在多的一方
- 多对一字段的变量名一般设置为关联的模型的小写单数,而多对多则一般设置为小写复数。
from django.db import models
class Manufacturer(models.Model):
# ...
pass
class Car(models.Model):
manufacturer = models.ForeignKey(Manufacturer, on_delete=models.CASCADE)
如果要关联的模型位于当前模型之后, 则需要通过字符串的方式进行引用
from django.db import models
class Car(models.Model):
manufacturer = models.ForeignKey(
'Manufacturer', # 注意这里
on_delete=models.CASCADE,
)
# ...
class Manufacturer(models.Model):
# ...
pass
如果要关联的对象在另外一个app中, 可以显式的指出.
假设Manufacturer模型在production这个app中.
class Car(models.Model):
manufacturer = models.ForeignKey(
'production.Manufacturer',
on_delete=models.CASCADE,
)
外键的参数
on_delete
当一个外键关联的对象被删除时, Django将根据on_delete参数定义的SQL约束进行相应的操作
- 如果有一个可以为空的外键, 并且让它在关联的对象被删除时, 自动设为null:
user = models.ForeignKey(
User,
on_delete=models.SET_NULL,
blank=True,
null=True,
)
可选参数
CASCADE
: 将定义有外键的模型对象同时删除.PROTECT
: 阻止上面的删除操作, 但是弹出ProtectedError异常SET_NULL
: 将外键字段设为null, 该字段必须设置null=TrueSET_DEFAULT
: 将外键字段设为默认值, 只有当字段设置了default参数时, 方可使用该值.DO_NOTHING
: 什么也不做SET()
: 设置为一个传递给SET()的值或者一个回调函数的返回值.limit_choices_to
: 该参数用于限制外键所能关联的对象, 只能用于Django的ModelForm和admin后台
staff_member = models.ForeignKey(
User,
on_delete=models.CASCADE,
limit_choices_to={'is_staff': True},
)
# 这样定义, 则ModelsForm的staff_member字段列表中, 只会出现哪些is_staff=True的Users对象.
related_name
: 用于关联对象反向引用模型的名称. 通常情况下, 这个参数我们可以不设置, Django会默认以模型的小写加上_set作为反向关联名.to_field
:
默认情况下,外键都是关联到被关联对象的主键上(一般为id)。如果指定这个参数,可以关联到指定的字段上,但是该字段必须具有unique=True属性,也就是具有唯一属性。
多对多(ManyToManyField)
class MangToManyField(to, **options)
多对多的字段可以定义在任何一方, 但不要同时都定义
from django.db import models
class Topping(models.Model):
# ...
pass
class Pizza(models.Model):
# ...
toppings = models.ManyToManyField(Topping)
在数据库后台,Django实际上会额外创建一张用于体现多对多关系的中间表。默认情况下,该表的名称是“多对多字段名+包含该字段的模型名+一个独一无二的哈希码”
一对一(OneToOneField)
class OnToOneField(to, on_delete, parent_link=False, **options)