drf中表之间断关联操作

断关联表关系有优点也有缺点,先看代码:
from django.db import models

# Book表:
# Publish表:
# Author表:
# AuthorDetail表:
from django.contrib.auth.models import User
class BaseModel(models.Model):
    is_delete = models.BooleanField(default=False)
    created_time = models.DateTimeField(auto_now_add=True)

    class Meta:
        # 基表,为抽象表,是专门用来被继承,提供公有字段的,自身不会完成数据库迁移
        abstract = True

# 断关联表关系
# 1)不会影响连表查询操作效率
# 2)会提升连表增删改操作效率
# 3)易于后期数据库表的重构
# 4)缺点在于:数据库本身没有连表检测,容易出现脏数据,需要通过严格的逻辑避免脏数据的参数(必要的时候管理脏数据)

# 举例:A依赖B,先插入A记录,该记录对应的B记录没产生,在没有关联的情况下,该操作可以实现,但是数据就是脏数据
# 接着再将B数据添加,脏数据就得到处理了。反过来先操作B后操作A,更满足逻辑思维,一样可以执行。通过逻辑将AB表进行
# 连表查询,不会有任何异常

"""
表关系
1)Book 和 Publish 一对多:外键在多的一方 Book
2)Book 和 Author 多对多:外键在查询频率高的一方 Book
3)Author 和 AuthorDetail 一对一:外键要根据实际需求建立在合理的位置 AuthorDetail
"""
""" 外键字段属性
1)related_name在外键中设置外键反向查询的字段名:正向找字段名,反向找related_name值
2)on_delete在外键中必须设置,表示级联关系,在Django 1.x下,系统默认提供(值为models.CASCADE),Django 2.x下,必须手动明确
        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级联关系,默认为级联,如果要处理级联关系,需要手动明确关系表,处理关系表中的多个外键

3) db_constraint在外键中控制表关联,默认为True表示关联,设置False表示断开关联
"""
class Book(BaseModel):
    name = models.CharField(max_length=64)
    price = models.DecimalField(max_digits=10, decimal_places=2)
    publish = models.ForeignKey(to=‘Publish‘, related_name=‘books‘, db_constraint=False, on_delete=models.DO_NOTHING, null=True)
    authors = models.ManyToManyField(to=‘Author‘, related_name=‘books‘, db_constraint=False)

    def __str__(self):
        return self.name

class Publish(BaseModel):
    name = models.CharField(max_length=64)
    address = models.CharField(max_length=64)

class Author(BaseModel):
    name = models.CharField(max_length=64)

class AuthorDetail(BaseModel):
    mobile = models.CharField(max_length=64)
    author = models.OneToOneField(to=Author, related_name=‘detail‘, db_constraint=False, on_delete=models.CASCADE)

子序列

  • 只能在序列化中使用
  • 字段名必须是外键(正向反向)字段
  • 因为相对于自定义序列化外键字段,自定义序列化字段是不能参与反序列化的,而子序列化必须为外键名,所以就无法入库
  • 在外键关联数据是多条时,需要明确many=True
  • 是单向操作,因为作为子序列化的类必须写在上方,所以不能产生逆方向的子序列化
# 出版社群查
class PublishAPIView(APIView):
    def get(self, request, *args, **kwargs):
        publish_query = models.Publish.objects.all()
        publish_ser = serializers.PublishModelSerializer(publish_query, many=True)
        return Response({
            ‘status‘: 0,
            ‘msg‘: ‘ok‘,
            ‘results‘: publish_ser.data
        })
class PublishModelSerializer(serializers.ModelSerializer):

    class Meta:
        model = models.Publish
        # fields = ‘__all__‘
        fields = [‘name‘, ‘address‘, ‘books‘]

原文地址:https://www.cnblogs.com/sweet-i/p/12116999.html

时间: 2024-10-10 20:34:54

drf中表之间断关联操作的相关文章

thinkphp框架中“关联操作”的完整定义详解

在复杂的关联操作中,如果要给关联定义增加可选的属性,我们可以采用完整定义的方式. 完整定义的格式是: protected $_link = array( '关联表名1'  =>  array( '该表的关联方式的属性1' => '定义', '该表的关联方式的属性N' => '定义', ), '关联表名2'  =>  array( '该表的关联方式的属性1' => '定义', '该表的关联方式的属性N' => '定义', ), ... ); 在上面的格式描述中,对于属性我

oracle MERGE INTO...USING两表关联操作(效率高)

数据量小的时候可以使用子查询做两表关联操作:但数据量大的时候子查询效率太低(因为是单条比对) 比如: update person1 p1 set p1.p_name=(select p_name from person2 where p1.p_id=p2.p_id) where p1.add_date>to_date('2014-09-01','yyyy-mm-dd') 而使用MERGE INTO...USING 作两表关联操作(增.删.改)就效率非常高 MERGE INTO person1 p

Hibernate关联操作、查询操作、高级特性、并发处理机制

本文所需的数据库初始文件,Hibernate常用操作的完整示例代码(包含所有Hibernate操作所需jar文件)提供下载学习:http://download.csdn.net/detail/daijin888888/9551724 1.Hibernate关联映射 1)什么是关联映射? 如果表之间具有关联关系,Hibernate允许我们在hbm.xml中描述他们的关联关系,然后在我们操作其中一张表时,自动的根据这种关系操作到另外的关系表,那么这种关联关系的设置,我们称之为关联映射. 2)关联映射

jmeter之关联操作

测试接口过程中,常常会遇到这样的一个情况:上一个请求返回的数据,另外一个接口需要要使用.那么,使用Jmeter操作时我们常常可以用"关联"来实现. 以接口"登录"和"金币充值"为例:即在做"金币充值"的接口时,需要用到"登录"的返回数据. 1.添加"登录"接口,并配置各参数,如图: 2.为"登录"接口添加[email protected] Path Extractor

Spark RDD常用算子操作(八) 键值对关联操作 subtractByKey, join,fullOuterJoin, rightOuterJoin, leftOuterJoin

原文作者:翟开顺首发:CSDN本人仅为自己方便查阅做了摘抄,请支持原作者原文地址:https://blog.csdn.net/t1dmzks/article/details/72077428 github: https://github.com/zhaikaishun/spark_tutorial/tree/master/src/main/java/com/spark/rdd_tutorial/tutorial8先从spark-learning中的一张图大致了解其功能 subtractByKey

SQL关联操作(查询与更新)

    sql的除了关联查询,还可以关联更新删除等,有时可以一条sql搞定数据移植, 避免写存储过程时. 以下列举了sql的各种级联操作场景.        主表:部门表-dept(dept_id,dname,enum)       从表:员工表-emp (emp_id , ename , sal,dept_id)       //以下是oracle的sql语法  1,关联查询     场景:查询所有员工的部门名称                     2,关联更新     场景:更新部门表的

Hibernate5-自关联操作

1.创建项目,项目名称hibernatedemo12,目录结构如图所示 2.在项目中创建lib目录存储jar文件,目录结构如图所示 3.在src目录中创建实体Bean Comment,包名(com.mycompany.demo.bean),如图所示 4.实体Bean Comment的内容如下 package com.mycompany.demo.bean; import java.util.Set; public class Comment { private int id; private S

thinkphp关联操作

比如:你要求删除用户的时候,同时删除与用户有关的所有信息. 一对一:  有 (HAS_ONE)   属于 (BELONGS_TO)    一对多:  有 (HAS_MANY)  属于 (BELONG_TO)    多对多:  (MANY_TO_MANY) HAS_ONE  HAS_MANY: 表aoli_member 表aoli_good MemberModel.class.php <?phpclass MemberModel extends RelationModel{    protecte

javascript 中表单元素的操作

1.访问form元素 1.1获得表单 oForm = document.getElementById("myForm"); oForm = document.forms["myForm"]; oForm = document.forms[0]; 1.2表单元素 通过表单字段:oForm.elements[0]; 通过名称:oForm.text1;oForm.["he is a boy"];//每个表单字段成为表单的属性,通过name值访问 1.3