• 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
    参考
  • 相关阅读:
    6.Mysql之MGR的限制和局限性
    5.Mysql之MGR原理浅谈02
    2.shell之cut详解
    1.Shell编程的基本语法01
    4.Mysql之MGR浅谈01
    3.Mysql之MHA实战(03)
    2.Mysql之高可用架构MHA(02)
    1.数据库的三大范式是什么?
    1.Mysql之主从复制浅谈01
    6.Mydumper和Myloader备份恢复
  • 原文地址:https://www.cnblogs.com/jjzz1234/p/11608181.html
Copyright © 2020-2023  润新知