Django-ORM外键属性总结

ForeignKey

 1  ForeignKey(ForeignObject) # ForeignObject(RelatedField)
 2     to,                 # 要进行关联的表名
 3     to_field=None,     # 要关联的表中的字段名称
 4     on_delete=None,     # 当删除关联表中的数据时,当前表与其关联的行的行为
 5                         - models.CASCADE,删除关联数据,与之关联也删除
 6                         - models.DO_NOTHING,删除关联数据,引发错误IntegrityError
 7                         - models.PROTECT,删除关联数据,引发错误ProtectedError
 8                         - models.SET_NULL,删除关联数据,与之关联的值设置为null(前提FK字段需要设置为可空)
 9                         - models.SET_DEFAULT,删除关联数据,与之关联的值设置为默认值(前提FK字段需要设置默认值)
10                         - models.SET,删除关联数据,
11                                 a. 与之关联的值设置为指定值,设置:models.SET(值)
12                                 b. 与之关联的值设置为可执行对象的返回值,设置:models.SET(可执行对象)
13   
14                                     def func():
15                                         return 10
16   
17                                     class MyModel(models.Model):
18                                         user = models.ForeignKey(
19                                             to="User",
20                                             to_field="id"
21                                             on_delete=models.SET(func),)
22     related_name=None,         # 反向操作时,使用的字段名,用于代替 【表名_set】 如: obj.表名_set.all()
23     related_query_name=None,   # 反向操作时,使用的连接前缀,用于替换【表名】     如: models.UserGroup.objects.filter(表名__字段名=1).values('表名__字段名')
24     limit_choices_to=None,     # 在Admin或ModelForm中显示关联数据时,提供的条件:
25                                 # 如:
26                         - limit_choices_to={'nid__gt': 5}
27                         - limit_choices_to=lambda : {'nid__gt': 5}
28   
29                         from django.db.models import Q
30                         - limit_choices_to=Q(nid__gt=10)
31                         - limit_choices_to=Q(nid=8) | Q(nid__gt=10)
32                         - limit_choices_to=lambda : Q(Q(nid=8) | Q(nid__gt=10)) & Q(caption='root')
33     db_constraint=True         # 是否在数据库中创建外键约束
34     parent_link=False           # 在Admin中是否显示关联数据
ForeignKey

OneToOneField

 1  OneToOneField(ForeignKey)
 2     to,                 # 要进行关联的表名
 3     to_field=None       # 要关联的表中的字段名称
 4     on_delete=None,     # 当删除关联表中的数据时,当前表与其关联的行的行为
 5   
 6                         ###### 对于一对一 ######
 7                         # 1. 一对一其实就是 一对多 + 唯一索引
 8                         # 2.当两个类之间有继承关系时,默认会创建一个一对一字段
 9                         # 如下会在A表中额外增加一个c_ptr_id列且唯一:
10                                 class C(models.Model):
11                                     nid = models.AutoField(primary_key=True)
12                                     part = models.CharField(max_length=12)
13   
14                                 class A(C):
15                                     id = models.AutoField(primary_key=True)
16                                     code = models.CharField(max_length=1)
OneToOneField

ManyToManyField

ManyToManyField(RelatedField)
    to,                         # 要进行关联的表名
    related_name=None,         # 反向操作时,使用的字段名,用于代替 【表名_set】 
    # 如: obj.表名_set.all()
    related_query_name=None,   # 反向操作时,使用的连接前缀,用于替换【表名】     
    # 如: models.UserGroup.objects.filter(表名__字段名=1).values('表名__字段名')
    limit_choices_to=None,     # 在Admin或ModelForm中显示关联数据时,提供的条件:
                                # 如:
                                    - limit_choices_to={'nid__gt': 5}
                                    - limit_choices_to=lambda : {'nid__gt': 5}
  
                                    from django.db.models import Q
                                    - limit_choices_to=Q(nid__gt=10)
                                    - limit_choices_to=Q(nid=8) | Q(nid__gt=10)
                                    - limit_choices_to=lambda : Q(Q(nid=8) | Q(nid__gt=10)) & Q(caption='root')
    symmetrical=None,           # 仅用于多对多自关联时,symmetrical用于指定内部是否创建反向操作的字段
                                # 做如下操作时,不同的symmetrical会有不同的可选字段
                                    models.BB.objects.filter(...)
  
                                    # 可选字段有:code, id, m1
                                        class BB(models.Model):
  
                                        code = models.CharField(max_length=12)
                                        m1 = models.ManyToManyField('self',symmetrical=True)
  
                                    # 可选字段有: bb, code, id, m1
                                        class BB(models.Model):
  
                                        code = models.CharField(max_length=12)
                                        m1 = models.ManyToManyField('self',symmetrical=False)
  
    through=None,               # 自定义第三张表时,使用字段用于指定关系表
    through_fields=None,       # 自定义第三张表时,使用字段用于指定关系表中那些字段做多对多关系表
                                    from django.db import models
  
                                    class Person(models.Model):
                                        name = models.CharField(max_length=50)
  
                                    class Group(models.Model):
                                        name = models.CharField(max_length=128)
                                        members = models.ManyToManyField(
                                            Person,
                                            through='Membership',
                                            through_fields=('group', 'person'),
                                        )
  
                                    class Membership(models.Model):
                                        group = models.ForeignKey(Group, on_delete=models.CASCADE)
                                        person = models.ForeignKey(Person, on_delete=models.CASCADE)
                                        inviter = models.ForeignKey(
                                            Person,
                                            on_delete=models.CASCADE,
                                            related_name="membership_invites",
                                        )
                                        invite_reason = models.CharField(max_length=64)
    db_constraint=True,         # 是否在数据库中创建外键约束
    db_table=None,             # 默认创建第三张表时,数据库中表的名称
ManyToManyField
参考
原文地址:https://www.cnblogs.com/jjzz1234/p/11608181.html