• Django学习-21-表关系参数


    一对多关系

    ForeignKey(ForeignObject) # ForeignObject(RelatedField)
        to,                         # 要进行关联的表名
        to_field=None,              # 要关联的表中的字段名称
        on_delete=None,             # 当删除关联表中的数据时,当前表与其关联的行的行为
            - models.CASCADE,删除关联数据,与之关联也删除
            - models.DO_NOTHING,删除关联数据,引发错误IntegrityError
            - models.PROTECT,删除关联数据,引发错误ProtectedError
            - models.SET_NULL,删除关联数据,与之关联的值设置为null(前提FK字段需要设置为可空)
            - models.SET_DEFAULT,删除关联数据,与之关联的值设置为默认值(前提FK字段需要设置默认值)
            - models.SET,↓↓↓↓↓↓↓↓↓↓
                a. 与之关联的值设置为指定值,设置:models.SET(值)
                b. 与之关联的值设置为可执行对象的返回值,设置:models.SET(可执行对象)
                    def func():
                        return 10
                    class MyModel(models.Model):
                        user = models.ForeignKey(
                            to="User",
                            to_field="id"
                            on_delete=models.SET(func),
                        )
        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')
        db_constraint=True          # 是否在数据库中创建外键约束
        parent_link=False           # 在Admin中是否显示关联数据

    一对一关系

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

    多对多关系

    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,              # 默认创建第三张表时,数据库中表的名称
  • 相关阅读:
    c语言结构体数组引用
    c语言结构体数组定义的三种方式
    如何为SAP WebIDE开发扩展(Extension),并部署到SAP云平台上
    SAP SRM ABAP Webdynpro和CFCA usb key集成的一个原型开发
    使用SAP API portal进行SAP SuccessFactors的API测试
    SAP UI5应用里的页面路由处理
    在SAP WebIDE Database Explorer里操作hdi实例
    如何使用SAP事务码SAT进行UI应用的性能分析
    使用SAP WebIDE进行SAP Cloud Platform Business Application开发
    SAP CRM WebClient UI ON_NEW_FOCUS的用途
  • 原文地址:https://www.cnblogs.com/cq146637/p/7819545.html
走看看 - 开发者的网上家园