写在前面:
关联未定义的model,(无论是否定义都推荐)直接指定 model 的名字而非 model 对象
model也可以关联自身,即可以与自己建立 一对多 / 多对多 映射,比如
self = models.ForeignKey('self')
一对一 OneToOneField()
参数:
1. to:{_meta} 用于指定关联的Model
2.on_delete 级联删除
- CASCADE:默认值,model对象会和ForeignKey关联对象一起被删除
- SET_NULL:将model对象的ForeignKey字段设为null。当然需要将null设为True。
- SET_DEFAULT:将model对象的ForeignKey字段设为默认值。
- Protect:删除ForeignKey关联对象时会生成一个ProtectedError,这样ForeignKey关联对象就不会被删除了。
- SET():将model对象的ForeignKey字段设为传递给SET()的值。
- DO_NOTHING:啥也不做
3.to_field 指定当前关系与被关联对象中的哪个字段关联。默认情况下,to_field 指向被关联对象的主键。
例如:
key = models.OneToOneField(Model, on_delete=models.CASCADE(), to_field="id")
一对多 ForeignKey()
参数:
to:{_meta} ,on_delete , to_field 同上
limit_choices_to 它是一个包含筛选条件和对应值的字典,用来在 Django 管理后台筛选 关联对象。
related_name 反向名称,用来从被关联字段指向关联字段。
当一张表的多个字段指向同一张表时,通过另外一张表逆向访问XXX_set属性时无法确定访问到的是哪个属性。这时,我们就需要为每个字段定义一个related_name属性,另外一张表访问这个表时,就会根据related_name的值来得到各个属性了。
注意:如果Django不需要创建向后关系,只需related_name = '+'或以'+'结尾。当在抽象模型上定义关系时,
必须设置此值。当这样做时可以使用一些特殊的语法。
related_query_name 用于来自目标模型的反向过滤器名称的名称。 它默认为related_name或的值
db_constraint 默认值为 True ,当db_constraint=True时会在数据库上建立外键约束, 在该值为False时不建立约束.
待补充:, parent_link=
from django.db import models
#一个作者可以创作多本书,一本书也可能由多个作者创作 manytomany
#一个出版社出版多本书,一本书只能由一个出版社出版
class Author(models.Model):
aut_name = models.CharField(max_length=20)
class Publisher(models.Model):
pub_name = models.CharField(max_length=20)
class Book(models.Model):
book_name = models.CharField(max_length=20)
pub = models.ForeignKey('Publisher', related_name='id', on_delete=models.CASCADE())
authors = models.ManyToManyField('Author', related_name='id',)
多对多 ManyToManyField()
参数:
to:{_meta} , to_field ,related_name , limit_choices_to 同上
注意:当使用 through 手动指定中间表时 limit_choices_to 不起作用
symmetrical 只要定义递归的多对多关系时起作用。
through 手动指定中间表
through_fields 接受一个2元组('field1','field2'),其中field1是定义ManyToManyField的模型外键的名称,
field2是外键的名称目标模型)。如果在中介模型上有多个外键用于参与多对多关系的任何
模型(或甚至两个模型),则必须指定through_fields
db_table 指定数据库中保存多对多关系数据的表名称。如果没有提供该选项,
Django 就会根据两个关系表的名称生成一个新的表名,做为中间表的名称。
swappable