DRF框架中链表数据通过ModelSerializer深度查询方法汇总
DRF框架中链表数据通过ModelSerializer深度查询方法汇总
一.准备测试和理解准备
创建类
class Test1(models.Model):
    id = models.IntegerField(primary_key=True)
    test_2_id= models.ForeignKey(to='Test2',on_delete='id') #这里有的创建失败了哈哈忘了会自动补全id
class Test2(models.Model):
    id = models.IntegerField(primary_key=True)
    name = models.CharField(max_length=60)
生成表单数据
Test1
| id | test_2_id_id | 
|---|---|
| 1 | 1 | 
| 2 | 2 | 
Test2
| id | name | 
|---|---|
| 1 | 名字1 | 
| 2 | 名字2 | 
二.深度查询通过Test1获得Test2的name而不是id
方法一
models.py
#对于test1添加方法
class Test1(models.Model):
    id = models.IntegerField(primary_key=True)
    test_2_id= models.ForeignKey(to='Test2',on_delete='id')
    @property
    def get_test2_name(self):
        return self.test_2_id.name
views.py
from rest_framework.serializers import ModelSerializer
from app.models import Test1
class Test_ser(ModelSerializer):
    class Meta:
        model = Test1  # 这里会把Test1面的所有名称空间存在的都进行导入
        fields = ('id','get_test2_name')
class Test(APIView):
    def get(self,request):
        test1_objs = Test1.objects.all()
        test1_ser = Test_ser(instance=test1_objs,many=True).data
        for a in test1_ser:
            print(a)
        return HttpResponse('ok')
方法二
views.py
from rest_framework.serializers import ModelSerializer
from app.models import Test1,Test2
class Test_2_ser(ModelSerializer):
    class Meta:
        model = Test2
        fields = '__all__'
class Test_ser(ModelSerializer):
    test_2_id = Test_2_ser()  #test_2_id为Test1与Test2关联的字段
    class Meta:
        model = Test1
        fields = '__all__'
class Test(APIView):
    def get(self,request):
        test1_objs = Test1.objects.all()
        test1_ser = Test_ser(instance=test1_objs,many=True).data
        for a in test1_ser:
            print(a)
        return HttpResponse('ok')
方法三
#通过添加自定义字段
class Test_ser(ModelSerializer):
    test_2_name = SerializerMethodField() #自定义字段名称
    def get_test_2_name(self,model):  #这里方法名必须get_字段名称
        return model.test_2_id.name    #对于获取字段后的返回值
    class Meta:
        model = Test1
        fields = '__all__'
class Test(APIView):
    def get(self,request):
        test1_objs = Test1.objects.all()
        test1_ser = Test_ser(instance=test1_objs,many=True).data
        for a in test1_ser:
            print(a)
        return HttpResponse('ok')
方法四
#通过添加自定义字段
class Test_ser(ModelSerializer):
    image_url=serializers.CharField(source='test_2_id.name') #test1中的test_2_id.name的内容
    class Meta:
        model = Test1
        fields = '__all__'
class Test(APIView):
    def get(self,request):
        test1_objs = Test1.objects.all()
        test1_ser = Test_ser(instance=test1_objs,many=True,context={"request":request}).data
        for a in test1_ser:
            print(a)
        return HttpResponse('ok')
DRF框架中链表数据通过ModelSerializer深度查询方法汇总的更多相关文章
- SQLyog中创建数据表及相关查询方法
		USE du; /*1.创建账务表 id name mony*/ CREATE TABLE zhangwu(id INT PRIMARY KEY AUTO_INCREMENT, sname VARCH ... 
- django drf框架中的user验证以及JWT拓展的介绍
		登录注册是几乎所有网站都需要去做的接口,而说到登录,自然也就涉及到验证以及用户登录状态保存,最近用DRF在做的一个关于网上商城的项目中,引入了一个拓展DRF JWT,专门用于做验证和用户状态保存.这个 ... 
- drf框架中jwt认证,以及自定义jwt认证
		0909自我总结 drf框架中jwt 一.模块的安装 官方:http://getblimp.github.io/django-rest-framework-jwt/ 他是个第三方的开源项目 安装:pi ... 
- DRF框架中分页功能接口
		目录 DRF框架中分页功能接口 DRF框架中分页功能接口 一.在框架中提供来三个类来实现分页功能,PageNumberPagination.LimitOffsetPagination.CursorPa ... 
- drf框架中所有视图及用法
		0909自我总结 drf框架中所有视图及用法 一.drf框架中的所有视图类 from django.views import View from rest_framework import views ... 
- drf框架中认证与权限工作原理及设置
		0909自我总结 drf框架中认证与权限工作原理及设置 一.概述 1.认证 工作原理 返回None => 游客 返回user,auth => 登录用户 抛出异常 => 非法用户 前台 ... 
- drf框架中分页组件
		drf框架中分页组件 普通分页(最常用) 自定制分页类 pagination.py from rest_framework.pagination import PageNumberPagination ... 
- DRF框架中的异常处理程序
		目录 DRF框架中自定义异常处理 一.自定义异常的原因 二.如何设置处理异常的程序 DRF框架中自定义异常处理 一.自定义异常的原因 在Django和DRF框架中都封装了很多的处理异常的程序,可以处理 ... 
- Python的Django框架中forms表单类的使用方法详解
		用户表单是Web端的一项基本功能,大而全的Django框架中自然带有现成的基础form对象,本文就Python的Django框架中forms表单类的使用方法详解. Form表单的功能 自动生成HTML ... 
随机推荐
- 寻找丢失的微服务-HAProxy热加载问题的发现与分析 原创: 单既喜  一点大数据技术团队  4月8日 在一点资讯的容器计算平台中,我们通过HAProxy进行Marathon服务发现。本文记录HAProxy服务热加载后某微服务50%概率失效的问题。设计3组对比实验,验证了陈旧配置的HAProxy在Reload时没有退出进而导致微服务丢失,并给出了解决方案.  Keywords:HAProxy热加
			寻找丢失的微服务-HAProxy热加载问题的发现与分析 原创: 单既喜 一点大数据技术团队 4月8日 在一点资讯的容器计算平台中,我们通过HAProxy进行Marathon服务发现.本文记录HAPro ... 
- 手把手教你MyEclipseUML建模(上)
			手把手教你MyEclipseUML建模(上) 转 https://blog.csdn.net/qq_37939251/article/details/83444359 1.用UML 1建模 MyEcl ... 
- [Java复习] 分布式PRC - Dubbo
			分布式RPC框架 dubbo常见问题: 1. 问dubbo的工作原理:服务注册,注册中心,服务生产者,消费者,代理通信,负载均衡 2. 问网络通信,序列化: dubbo协议,长连接,NIO,hessi ... 
- ThinkPhp5 mongodb 使用自定义objectID出错解决
			在Tp5中使用mongodb 使用自定义ObjectId时报错:Cannot use object of type MongoDB\\BSON\\ObjectID as array 查询源码发现在to ... 
- ehcache的heap、off-heap、desk浅谈
			ehcache的heap.off-heap.desk浅谈 答: 从读取速度上比较:heap > off-heap > disk heap堆内内存: heap表示使用堆内内存,heap( ... 
- ContextCleaner ——Spark  应用程序的垃圾回收器
			ContextCleaner是一个Spark服务,负责在应用程序范围内清除 shuffles, RDDs, broadcasts, accumulators和checkpointed RDDs,目的是 ... 
- Lombok子类与父类的@Builder注解冲突
			解决方法之一:去掉父类的@builder 缺点:父类不能使用Builder构造器模式 来源:https://www.cnblogs.com/lori/p/10266508.html 
- 排序算法的实现之Javascript(常用)
			排序算法的实现之Javascript 话不多说,直接代码. 1.冒泡排序 1.依次比较相邻的两个数,如果前一个比后一个大,则交换两者的位置,否则位置不变 2.按照第一步的方法重复操作前length-1 ... 
- 日常工作问题解决:redhat6.9--解决yum功能不能正常使用和配置yum源
			1.问题描述 解决RedHat6.9下yum功能不能用问题: 在redhat6.9下使用yum安装时,会提示:This system is not registered to Red Hat Subs ... 
- Oracle数据库四种数据完整性约束
			Oracle数据库四种数据完整性约束 1.实体完整性 同样的数据不能重复插入(1)采取什么措施保证实体完整性?我们可以给表创建主键约束吗,主键保证了数据的唯一性,主键可以保证同一条记录只能插入一次. ... 
