DRF框架中链表数据通过ModelSerializer深度查询方法汇总

一.准备测试和理解准备

创建类

  1. class Test1(models.Model):
  2. id = models.IntegerField(primary_key=True)
  3. test_2_id= models.ForeignKey(to='Test2',on_delete='id') #这里有的创建失败了哈哈忘了会自动补全id
  4. class Test2(models.Model):
  5. id = models.IntegerField(primary_key=True)
  6. 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

  1. #对于test1添加方法
  2. class Test1(models.Model):
  3. id = models.IntegerField(primary_key=True)
  4. test_2_id= models.ForeignKey(to='Test2',on_delete='id')
  5. @property
  6. def get_test2_name(self):
  7. return self.test_2_id.name

views.py

  1. from rest_framework.serializers import ModelSerializer
  2. from app.models import Test1
  3. class Test_ser(ModelSerializer):
  4. class Meta:
  5. model = Test1 # 这里会把Test1面的所有名称空间存在的都进行导入
  6. fields = ('id','get_test2_name')
  7. class Test(APIView):
  8. def get(self,request):
  9. test1_objs = Test1.objects.all()
  10. test1_ser = Test_ser(instance=test1_objs,many=True).data
  11. for a in test1_ser:
  12. print(a)
  13. return HttpResponse('ok')

方法二

views.py

  1. from rest_framework.serializers import ModelSerializer
  2. from app.models import Test1,Test2
  3. class Test_2_ser(ModelSerializer):
  4. class Meta:
  5. model = Test2
  6. fields = '__all__'
  7. class Test_ser(ModelSerializer):
  8. test_2_id = Test_2_ser() #test_2_id为Test1与Test2关联的字段
  9. class Meta:
  10. model = Test1
  11. fields = '__all__'
  12. class Test(APIView):
  13. def get(self,request):
  14. test1_objs = Test1.objects.all()
  15. test1_ser = Test_ser(instance=test1_objs,many=True).data
  16. for a in test1_ser:
  17. print(a)
  18. return HttpResponse('ok')

方法三

  1. #通过添加自定义字段
  2. class Test_ser(ModelSerializer):
  3. test_2_name = SerializerMethodField() #自定义字段名称
  4. def get_test_2_name(self,model): #这里方法名必须get_字段名称
  5. return model.test_2_id.name #对于获取字段后的返回值
  6. class Meta:
  7. model = Test1
  8. fields = '__all__'
  9. class Test(APIView):
  10. def get(self,request):
  11. test1_objs = Test1.objects.all()
  12. test1_ser = Test_ser(instance=test1_objs,many=True).data
  13. for a in test1_ser:
  14. print(a)
  15. return HttpResponse('ok')

方法四

  1. #通过添加自定义字段
  2. class Test_ser(ModelSerializer):
  3. image_url=serializers.CharField(source='test_2_id.name') #test1中的test_2_id.name的内容
  4. class Meta:
  5. model = Test1
  6. fields = '__all__'
  7. class Test(APIView):
  8. def get(self,request):
  9. test1_objs = Test1.objects.all()
  10. test1_ser = Test_ser(instance=test1_objs,many=True,context={"request":request}).data
  11. for a in test1_ser:
  12. print(a)
  13. return HttpResponse('ok')

DRF框架中链表数据通过ModelSerializer深度查询方法汇总的更多相关文章

  1. SQLyog中创建数据表及相关查询方法

    USE du; /*1.创建账务表 id name mony*/ CREATE TABLE zhangwu(id INT PRIMARY KEY AUTO_INCREMENT, sname VARCH ...

  2. django drf框架中的user验证以及JWT拓展的介绍

    登录注册是几乎所有网站都需要去做的接口,而说到登录,自然也就涉及到验证以及用户登录状态保存,最近用DRF在做的一个关于网上商城的项目中,引入了一个拓展DRF JWT,专门用于做验证和用户状态保存.这个 ...

  3. drf框架中jwt认证,以及自定义jwt认证

    0909自我总结 drf框架中jwt 一.模块的安装 官方:http://getblimp.github.io/django-rest-framework-jwt/ 他是个第三方的开源项目 安装:pi ...

  4. DRF框架中分页功能接口

    目录 DRF框架中分页功能接口 DRF框架中分页功能接口 一.在框架中提供来三个类来实现分页功能,PageNumberPagination.LimitOffsetPagination.CursorPa ...

  5. drf框架中所有视图及用法

    0909自我总结 drf框架中所有视图及用法 一.drf框架中的所有视图类 from django.views import View from rest_framework import views ...

  6. drf框架中认证与权限工作原理及设置

    0909自我总结 drf框架中认证与权限工作原理及设置 一.概述 1.认证 工作原理 返回None => 游客 返回user,auth => 登录用户 抛出异常 => 非法用户 前台 ...

  7. drf框架中分页组件

    drf框架中分页组件 普通分页(最常用) 自定制分页类 pagination.py from rest_framework.pagination import PageNumberPagination ...

  8. DRF框架中的异常处理程序

    目录 DRF框架中自定义异常处理 一.自定义异常的原因 二.如何设置处理异常的程序 DRF框架中自定义异常处理 一.自定义异常的原因 在Django和DRF框架中都封装了很多的处理异常的程序,可以处理 ...

  9. Python的Django框架中forms表单类的使用方法详解

    用户表单是Web端的一项基本功能,大而全的Django框架中自然带有现成的基础form对象,本文就Python的Django框架中forms表单类的使用方法详解. Form表单的功能 自动生成HTML ...

随机推荐

  1. 有依赖的背包---P1064 金明的预算方案

    P1064 金明的预算方案 solution 1 暴搜 70pt dfs (当前搜到了第几个物品,产生的总价值,剩下多少钱) 剪枝 1:如果剩下的钱数<0,直接return就好,没必要继续了 剪 ...

  2. unyielding 是否屈服与多线程 勿以恶小而为之 threads are a bad idea

    小结: 1. python的妥协 2. As we know, threads are a bad idea, (for most purposes). Threads make local reas ...

  3. BitmapFactory之Options

    package com.loaderman.customviewdemo; import android.app.Activity; import android.graphics.Bitmap; i ...

  4. Realsense D430 save

    rs-save-to-disk.cpp // License: Apache 2.0. See LICENSE file in root directory. // Copyright(c) 2015 ...

  5. 在 kubernetes 集群中部署一套 web 网站(网页内容不限)

    环境准备 一台部署节点,一台master节点,还有两台节点node1,node2 完好的k8s集群环境 思路一: 在node1和node2节点上通过宿主机与容器之间目录映射和端口映射上线静态网站(或动 ...

  6. asp.net core swagger使用及注意事项

    Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务.是一款RESTFUL接口的文档在线自动生成+功能测试软件.主要目的是构建标准的.稳定的.可重 ...

  7. sudo内容

    [root@bogon ~]# cat /etc/sudoers## Sudoers allows particular users to run various commands as## the ...

  8. win7下Excel2003/2010 同时打开多个独立窗口

    最近新买了本本,装了许多软件,由于许多苦逼的原因系统被我搞的乱乱的,不得已重装了几次,话说之前我用的都是台式机,用得蛮顺的,但是在重装系统之后发现自己装的Office 2003 在打开Excel 文档 ...

  9. ALBPM Service Config

    ALBPM Config About ALBPM Studio Msg , JSP and webResources together deploy services. Msg     "D ...

  10. 查看某个进程PID对应的文件句柄数量,查看某个进程当前使用的文件句柄数量

    ================================ 1.linux所有句柄查询 lsof -n|awk '{print $2}'|sort|uniq -c |sort -nr|more ...