Django - 模型层 - 关系类型字段

多对一 (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=True
  • SET_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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值