django基础之model连表

django的连表有三种结构:

  • 一对多:models.ForeignKey(其他表)
ForeignKey(ForeignObject)
    to,                     # 要关联的表名
    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(可执行对象)

    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}


    parent_link=False      # 在Admin中是否显示关联数据
    to_field=None          # 要关联的表中的字段名称
    db_constraint=True     # 是否在数据库中创建外键约束
  • 多对多:models.ManyToManyField(其他表)
ManyToManyField(RelatedField)
    to,                # 要进行关联的表名
    related_name=None, # 反向操作时,使用的字段名,用于代替 【表名_set】 如: obj.表名_set.all()
    related_query_name=None, # 反向操作时,使用的连接前缀,用于替换【表名】
    limit_choices_to=None, # 在Admin或ModelForm中显示关联数据时,提供的条件:
    symmetrical=None,    # 仅用于多对多自关联时,symmetrical用于指定内部是否创建反向操作的字段
    through=None,        # 自定义第三张表时,使用字段用于指定关系表
    through_fields=None, # 自定义第三张表时,使用字段用于指定关系表中那些字段做多对多关系表
    db_constraint=True,  # 是否在数据库中创建外键约束
    db_table=None,       # 默认创建第三张表时,数据库中表的名称
  • 一对一:models.OneToOneField(其他表)
OneToOneField(ForeignKey)
    to,                 # 要进行关联的表名
    to_field=None       # 要关联的表中的字段名称
    on_delete=None,     # 当删除关联表中的数据时,当前表与其关联的行的行为

发表评论

电子邮件地址不会被公开。