DRF4级联与外键字段


断关联表关系
外键字段属性
多表操作
断关联表关系
'''
1.不会影响连表查询操作效率
2.会提升连表增删改操作效率
3.易于后期数据库表的重构
4.缺点:数据库本身设有连表检测,容易出现脏数据,需要通过严格的逻辑避免脏数据的参数(必要的时候管理脏数据)
举例:
    A依赖B,先插入A记录,该记录对应的B记录没产生,在没有关联的情况下,该操作可以实现,但是数据就是脏数据。接着再将B数据添加,脏数据就得到处理了。反过来先操作B后操作A,更满足逻辑思维,一样可以执行。通过逻辑将AB表进行
连表查询,不会有任何异常

'''
外键字段属性
'''
1. relater_name在外键中设置外键反向查询的字段名:正向找字段,反向找relater_name值
2.on_delete在外键中必须设置,表示级联关系,
    在django 1.x下,系统默认提供(值为models.CASCADE)
    在django 2.x下,必须手动明确

on_delete参数:
    CASCADE:默认值,级联
        例子:作者没,详情一定没,存在没意义

    DO_NOTHING:外键不会被级联,
        假设A表依赖B表,B记录被删除,A表的外键字段不做任何处理
        例子:作者没,书还是作者写的 | 出版社没,书还是该出版社出版的

    SET_DEFAULT:外键字段给与默认值
        假设A表依赖B表,B记录删除,A表的外键字段置为default属性设置的值,所以必须配合default属性使用
        例子:部门没,部门员工进入待定部门(注:部门表一定要有待定部门记录)

    SET_NULL:
        假设A表依赖B表,B记录删除,A表的外键字段置为null,所以必须配合null=True属性使用
        例子:部门没,部门员工进入未分组部门(注:关联部门表外键可以为空)

        注:多对多字段不能设置on_delete级联关系,默认为级联,如果要处理级联关系,需要手动明确关系表,处理关系表中的多个外键

'''
多表操作
# 多表操作

class BookModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.Book
        fields = '__all__'

class PublishModelSerializer(serializers.ModelSerializer):
    # 子序列化:
    # 1)只能在序列化中使用
    # 2)字段名必须是外键(正向反向)字段
    #   因为相对于自定义序列化外键字段,自定义序列化字段是不能参与反序列化的,而子序列化必须为外键名,所以就无法入库
    # 3)在外键关联数据是多条时,需要明确many=True
    # 4)是单向操作,因为作为子系列的类必须写在上方,所以不能产生逆方向的子序列化
    class Meta:
        model = models.Publish
        # fields = '__all__'
        fields = ['name', 'address', 'books']

原文地址:https://www.cnblogs.com/ludundun/p/12117904.html

时间: 2024-10-01 05:00:48

DRF4级联与外键字段的相关文章

MS SQL巡检系列——检查外键字段是否缺少索引

前言感想:一时兴起,突然想写一个关于MS SQL的巡检系列方面的文章,因为我觉得这方面的知识分享是有价值,也是非常有意义的.一方面,很多经验不足的人,对于巡检有点茫然,不知道要从哪些方面巡检,另外一方面,网上关于MS SQL巡检方面的资料好像也不是特别多.写这个系列只是一个分享,自己的初衷是一个知识梳理.总结提炼过程,有些知识和脚本也不是原创,文章很多地方融入了自己的一些想法和见解的,不足和肤浅之处肯定也非常多,抛砖引玉,也希望大家提意见和建议.补充,指正其中的不足之处.Stay Hungry

基于MVC+EasyUI的Web开发框架经验总结(9)--在Datagrid里面实现外键字段的转义操作

我们在使用EasyUI的时候,很多情况下需要使用到表格控件datagrid,这个控件控件非常强大,使用起来很简洁,但是我在使用中,发现对于一个表里面的外键字段进行转义,并显示引用表的一些名称的操作,却显得比较难以实现,找了很多资料,基本上没有找到对应的解决方案.本文主要介绍我对这种外键字段转义的操作的实现方式,以便供大家参考了解. 1.DataGrid的初始化操作 在了解对内容的解析前,我们先来了解EasyUI里面Datagrid的初始化操作过程,然后逐步进行分析,寻求解决方式. 一般情况下,D

基于MVC4+EasyUI的Web开发框架经验总结(9)--在Datagrid里面实现外键字段的转义操作

我们在使用EasyUI的时候,很多情况下需要使用到表格控件datagrid,这个控件控件非常强大,使用起来很简洁,但是我在使用中,发现对于一个表里面的外键字段进行转义,并显示引用表的一些名称的操作,却显得比较难以实现,找了很多资料,基本上没有找到对应的解决方案.本文主要介绍我对这种外键字段转义的操作的实现方式,以便供大家参考了解. 1.DataGrid的初始化操作 在了解对内容的解析前,我们先来了解EasyUI里面Datagrid的初始化操作过程,然后逐步进行分析,寻求解决方式. 一般情况下,D

django模型中, 外键字段使用to_filed属性 指定到所关联主表的某个字段

在django项目的开发过程中,在设计模型时一开始将主键设置成了一个自定义的字段,但是在创建搜索索引时却发现必须要存在一个id的字段,并且为主键(不知道是否是项目一开始就这样配置的原因), 但此时表结构已经整体固定下来,并且有外键关联到了这个自定义的的主键,整个后台视图逻辑也已经封装完成,如果主表的主键发生改变,那么外键所在的表就会默认关联到新的主键上,那个后台视图的改动就会非常麻烦,这时就需要使用外键字段中的to_field属性来指定所关联的主表的某个字段,而不会影响到原先的逻辑 demo如下

序列化类外键字段的覆盖,十大接口序列化总结,视图家族

序列化类外键字段的覆盖 """ 1)在序列化类中自定义字段,名字与model类中属性名一致,就称之为覆盖操作 (覆盖的是属性的所有规则:extra_kwargs中指定的简易规则.model字段提供的默认规则.数据库唯一约束等哪些规则) 2)外键覆盖字段用PrimaryKeyRelatedField来实现,可以做到只读.只写.可读可写三种形式 只读:read_only=True 只写:queryset=关联表的queryset, write_only=True 可读可写:que

CSIC_716_20200221【drf--自定义外键字段、十大接口】

自定义序列化外键字段: 在序列化组件中  serializers.PrimaryKeyRelatedField(read_only=True)  #只读覆盖 serializers.PrimaryKeyRelatedField(queryset=.....all()  )  # 可读可写 serializers.PrimaryKeyRelatedField(queryset=.....all() ,write_only=True  )  # 只写 原文地址:https://www.cnblogs

django如何在 search_fields和list_filter 中包含外键字段

django如何在 search_fields和list_filter 中包含外键字段 我们知道在 admin.py 中定义 search_fields 可以控制在后台管理界面中能够搜索的字段. 但是,当 search_fields 包含外键字段时,此时进行搜索会报错: TypeError at /admin/hello/foo/ Related Field has invalid lookup: icontains 解决的办法是修改 search_fields 中的外键字段名称. 将 sear

django【ORM】 通过外键字段找对应类

两个方法其实是一种,用哪个都行,看实例: 方法一: 从list_filter中的字符串,找到model对象的字段,然后得到这个外键对应的类 循环,把list_filter中对应的类所有对象 方法二: 两方法实际上是一样的,导入方式和使用方式不同: 方法一: 导入:from django.db.models.fields.related import ForeignKey,ManyToManyField 使用:field.rel.to 方法二: 导入:from django.db.models i

Django annotate: 外键字段解析问题

错误信息: FieldError:Cannot resolve keyword 'entry' into field. Choices are:xx,xx,xx, Models: class Ami(models.Model):     .....      class AmiAdmin(admin.ModelAdmin):     list_display = ['id',....]        #list_filter = (.....)             class Entry(m