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. 什么是文件存储NAS

    阿里云文件存储(Network Attached Storage,简称 NAS)是面向阿里云 ECS 实例.E-HPC 和容器服务等计算节点的文件存储服务. 定义 阿里云文件存储 NAS 是一个可共享 ...

  2. 【AtCoder】AGC005

    AGC005 A - STring 用一个栈,如果遇到S就弹入,如果遇到T栈里有S就弹出栈顶,否则T在最后的串里,最后计算出的T和栈里剩的S就是答案 #include <bits/stdc++. ...

  3. 在springMVC框架中集成quartz作业调度器

    1.首先需要导入这几个jar包,如下图: 其中log4j,quartz,slf4j-api,slf4j-log4j12我是在项目中都引用了 2.引用完jar包后,新建一个作业调度类,执行作业调度逻辑, ...

  4. (三)mybatis 的使用(入门)

    目录 mybatis 的使用 -- 准备 mybatis 的使用 -- 搭建好工程结构 mybatis 的使用 -- 创建 sqlMapCnfig.xml 全局配置文件 mybatis 的使用 -- ...

  5. 护卫神等IIS设置Thinkphp框架的public目录为根目录的解决办法

    最近碰到一个棘手的问题,在使用护卫神或者主机宝等IIS环境配置PHP的时候,不能把public设置为网站根目录(因为Thinkphp的安全要求:要将public设置为对外公开目录),这个问题无法搜索到 ...

  6. gitlab安装指南(gitlab-ce-9.4.3-ce.0.el7.x86_64 centos7)

    1,安装gitlab wget https://packages.gitlab.com/gitlab/gitlab-ce/packages/el/7/gitlab-ce-9.4.3-ce.0.el7. ...

  7. System.Data.EntityException: The underlying provider failed on Open.

    场景:IIS默认站点建立程序,使用Windows集成身份验证方式,连接SQLServer数据库也是采用集成身份验证.我报“System.Data.EntityException: The underl ...

  8. 设置centos7中的mysql5.7不区分表名大小写有关操作

    1.#which mysqld          //查看mysql的命令路径 /usr/sbin/mysqld 2.#/usr/sbin/mysqld --verbose --help | grep ...

  9. c++11 常量表达式

    c++11 常量表达式 #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> #inclu ...

  10. JDK + Tomcat 安装 + 制作自定义镜像【第 2 篇 Tomcat】

    [第 1 篇 JDK]:https://www.cnblogs.com/del88/p/11842387.html[第 2 篇 Tomcat]:https://www.cnblogs.com/del8 ...