Queryset官方文档:https://docs.djangoproject.com/en/1.11/ref/models/querysets/

1、需求1:只取某n列

1、方法1:values

2、方法2:values_list

3、方法3:only,defer

# 需求1:只取某n列
# 推荐 方法3:only class Test1View(APIView):
def get(self, request, *args, **kwargs):
"""只取某n列""" # 方法1: values 返回值:queryset=[ {1, 'alex'}, {2, 'jack'}]
queryset = User.objects.all().values('id', 'username')
print(queryset, type(queryset)) # <class 'django.db.models.query.QuerySet'> ser = UserSerializer(instance=queryset, many=True)
print(ser, type(ser)) # <class 'rest_framework.serializers.ListSerializer'> print(ser.data, type(ser.data)) # <class 'rest_framework.utils.serializer_helpers.ReturnList'>
return Response(ser.data) # 方法2:values_list 返回值:queryset=[ (1, 'alex'), (2, 'jack')]
queryset = User.objects.all().values_list('id', 'username')
print(queryset, type(queryset)) ser = UserSerializer(instance=queryset, many=True)
print(ser, type(ser)) # 取数据error
# print(ser.data, type(ser.data))
return Response({}) # 推荐
# 方法3:only defer 返回值:queryset=[obj,obj] [<User: alex>, <User: jack>]
queryset = User.objects.all().only('id', 'username')
# queryset = User.objects.all().defer('username') # 排除某几个
print(queryset, type(queryset)) # 取值
for item in queryset:
print(item.id,item.username) # tip:only中没有age,可以取到age (不推荐)
# 1 alex # ser = UserSerializer(instance=queryset, many=True)
# print(ser.data, type(ser.data))
return Response({})

2、需求2: 打印所有用户姓名以及部门名称

1、方法1:all+跨表 (性能低)

2、方法2:主动创建关联关系 select_related:仅支持one2many

# b. 需求: 打印所有用户姓名以及部门名称
# https://docs.djangoproject.com/zh-hans/2.2/ref/models/querysets/#select-related class TestView(APIView):
def get(self, request, *args, **kwargs):
# 方法1:性能低 all() + 跨表
result = User.objects.all().values('username', 'dp__title') # 10次
# select * from user
for item in result:
print(item['username'], item['dp__title']) # 1次 # get + 跨表 只取一个
u = User.objects.get(id=1)
dpart = u.dp
title = dpart.title
print(u.username, title) return Response({}) # 方法2:主动创建关联关系
result = User.objects.all().select_related('dp')
# select * from user left join depart on user.dp_id = depart.id
print(result,type(result))
for item in result:
print(item.username, item.dp.title)
return Response({})

3、方法3:prefetch_related:2次单表查询,支持many2many

示例:
class Depart(models.Model): 5个部门
title = models.CharField(...) class User(models.Model): 10个用户
name = models.CharField(...)
email = models.CharField(...)
dp = models.FK(Depart)
1.以前的你:11次单表查询

    result = User.objects.all()
for item in result:
print(item.name,item.dp.title) 2. seleted_related,主动做连表查询(1次链表) result = User.objects.all().seleted_related('dp')
for item in result:
print(item.name,item.dp.title) 问题:如果链表多,性能越来越差。
3. prefetch_related:2次单表查询
# select * from user ;
# 通过python代码获取:dp_id = [1,2]
# select * from depart where id in dp_id
result = User.objects.all().prefetch_related('dp')
for item in result:
print(item.name,item.dp.title)

4、代码

models

from django.db import models

# Create your models here.

class Depart(models.Model):
title = models.CharField(max_length=32)
number = models.CharField(max_length=32) def __str__(self):
return self.title class User(models.Model):
username = models.CharField(max_length=32)
age = models.IntegerField()
dp = models.ForeignKey(to=Depart, on_delete=models.CASCADE)
def __str__(self):
return self.username

序列化

# -*- coding: utf-8 -*-
from django.shortcuts import render # Create your views here.
from rest_framework.views import APIView
from rest_framework.serializers import ModelSerializer
from rest_framework.response import Response from app01.models import User, Depart class UserSerializer(ModelSerializer):
class Meta:
model = User # model表
# fields = '__all__' # 所有字段
fields = ['id', 'username'] class DepartSerializer(ModelSerializer):
class Meta:
model = Depart
fields = '__all__'

ORM高阶补充:only, defer,select_related的更多相关文章

  1. python基础编程: 编码补充、文件操作、集合、函数参数、函数递归、二分查找、匿名函数与高阶函数

    目录: 编码的补充 文件操作 集合 函数的参数 函数的递归 匿名函数与高阶函数 二分查找示例 一.编码的补充: 在python程序中,首行一般为:#-*- coding:utf-8 -*-,就是告诉p ...

  2. 用一个简单的例子来理解python高阶函数

    ============================ 用一个简单的例子来理解python高阶函数 ============================ 最近在用mailx发送邮件, 写法大致如 ...

  3. Mapper映射语句高阶应用——ResultMap

    resultMap 元素是MyBatis 中最重要最强大的元素.它就是让你远离 90%的需要从结果 集中取出数据的 JDBC代码的那个东西, 而且在一些情形下允许你做一些 JDBC 不支持的事 情. ...

  4. Java高阶语法---static

    背景:听说static Java高阶语法是挺进BAT必经之路. static: 静态static,很多时候会令我望文生义,但是get到了static最重要的一点,其他的理解都还ok. static最重 ...

  5. 老师博客copy -高阶函数2

    新闻 管理   Py西游攻关之函数   一 函数是什么? 函数一词来源于数学,但编程中的「函数」概念,与数学中的函数是有很大不同的,具体区别,我们后面会讲,编程中的函数在英文中也有很多不同的叫法.在B ...

  6. day20 Python 高阶函数,函数,嵌套,闭包 装饰器

    高阶函数定义 1.函数接收的参数是一个函数名 2.函数的返回值是一个函数名 3.满足上述条件任意一个都可以称之为高阶函数 一.函数的接收参数是一个函数名 import time def foo(): ...

  7. Python高阶函数--map

    map()函数 map()是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把list 的每个元素依次作用在函数 f 上,得到一个新的 list 并返回. 例如,对于lis ...

  8. python 验证码 高阶验证

    python 验证码 高阶验证 标签: 验证码python 2016-08-19 15:07 1267人阅读 评论(1) 收藏 举报  分类: 其他(33)    目录(?)[+]   字符型图片验证 ...

  9. day37-1 面向对象高阶

    目录 面向对象高阶 isinstance issubclass 反射(自省) 模块的使用 放在类的使用 call 面向对象高阶 isinstance 判断是否为实例化对象,以后可以用来取代type 和 ...

随机推荐

  1. [转帖]Google Chrome 解决 “您的连接不是私密连接”

    Google Chrome 解决 “您的连接不是私密连接” 和被毒霸劫持 自己搭建了 k8s的 dashboard 结果 chrome 最新版本的打不开了.. 百度了下 园友的解决方案很完美 这里面转 ...

  2. HanLP封装为web services服务的过程介绍

    前几天的召开的2019年大数据生态产业大会不知道大家关注到没有,看到消息是hanlp2.0版本发布了.不知道hanlp2.0版本又将带来哪些新的变化?准备近期看能够拿到一些hanlp2.0的资料,如果 ...

  3. 如何使用RedisTemplate访问Redis数据结构之list

    Redis的List数据结构 这边我们把RedisTemplate序列化方式改回之前的 Jackson2JsonRedisSerializer<Object> jackson2JsonRe ...

  4. Netty源码剖析-发送数据

    参考文献:极客时间傅健老师的<Netty源码剖析与实战>Talk is cheap.show me the code! 开始之前先介绍下Netty写数据的三种方式: ①:write:写到一 ...

  5. Spring在Thread中注入Bean无效的解决方式

    在Spring项目中,有时需要新开线程完成一些复杂任务,而线程中可能需要注入一些服务.而通过Spring注入来管理和使用服务是较为合理的方式.但是若直接在Thread子类中通过注解方式注入Bean是无 ...

  6. SQLSERVER 在PROCEDURE 中动态执行SQL语句【EXEC】并获取

    1.直接上代码 CREATE PROCEDURE [dbo].[TEST] AS BEGIN DECLARE )='N8-4F', --構建SQL需要的條件 ),--構建後的SQL語句 @cnt in ...

  7. STM32 USB Virtual COM

    STM32 USB Virtual COM USB转串口的功能实现   这次讲的是如何实现USB转串口功能的实现.首先看看工程的布局吧: 我们主要要介绍的文件的在USB_User这个组文件.从上面的截 ...

  8. PHP转码函数mb_convert_encoding() 和iconv()

    注意:函数mb_convert_encoding的执行效率比iconv差,且需开启php的mbstring扩展. 一般情况下使用iconv,但此函数在碰到无法转码字符会丢弃,此种情况下可以用mb_co ...

  9. C#DataGrid列值出现E形式的小数,将DataGrid表格上的数据保存至数据库表时会因格式转换不正确导致报错

    问题描述:在DataGridView中调整金额一列,当输入小数0.000001后会显示1E-6,此时进行保存操作时报错,提示无法将string类型转换成Decimal 原因分析:由于列调整金额为1E- ...

  10. Sublime text3安装

    一.Sublime text3下载 [20190506]下载 官网下载:https://www.sublimetext.com/ https://download.sublimetext.com/Su ...