Django之Models(五) 表间关联

写在前面:

关联未定义的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

你可能感兴趣的:(Django学习)