Django Models 查询操作
1.准备数据表:
from django.db import models class City(models.Model):
name=models.CharField(max_length=32)
nid=models.AutoField(primary_key=True) class Author(models.Model):
name=models.CharField(max_length=32)
nid=models.AutoField(primary_key=True)
city=models.ForeignKey(to=City,on_delete=models.CASCADE) class Book(models.Model):
nid=models.AutoField(primary_key=True)
title=models.CharField(max_length=32)
author=models.ManyToManyField(to=Author) #中间表,不用写on_delete class info(models.Model):
telephone=models.IntegerField()
nid=models.AutoField(primary_key=True)
author=models.OneToOneField(to=Author,on_delete=models.CASCADE) #数据库中增加了字段author_id
2.插入数据:
models.City(name='losange').save()
models.City(name='shanghai').save() models.Book.objects.create(title='liao story')
models.Book.objects.create(title='spring')
models.Book.objects.create(title='old man and sea')
models.Book.objects.create(title='the sun rises')
models.Book.objects.create(title='cats')
models.Book.objects.create(title='lions') city=models.City.objects.first()
models.Author.objects.create(name='haimingwei',city=city)
city=models.City.objects.all()[1]
models.Author.objects.create(name='xuewen',city=city)
3.查询操作
#1.跨表多对多查询
    #模型关系   城市 <-- 作者 <-- 书
#查询haimingwei写的所有书籍 
    #基于对象-->反向查询(按表名_set) (返回queryset)
    models.Author.objects.get(name='haimingwei').book_set.values('title')
    #基于queryset-->反向查询(按表名) (返回queryset)
    models.Author.objects.filter(name='haimingwei').values('book__title')
    #基于queryset-->正向查询(按字段) (返回queryset)
    models.Book.objects.filter(author__name='haimingwei').values('title')
#查询spring这本书的作者
    #基于对象-->正向查询(按字段) (返回queryset)
    models.Book.objects.get(title='spring').author.values('name')
    #基于queryset-->反向查询(按表名) (返回queryset)
    models.Author.objects.filter(book__title='spring').values('name')
    #基于queryset-->正向查询(按字段) (返回queryset)
    models.Book.objects.filter(title='spring').values('author__name')
#2.跨表一对多查询    #模型关系   城市 <-- 作者 <-- 书    
    #查询shanghai所有的作者
    #基于对象 --> 反向查询(按表名_set) (返回queryset)
    models.City.objects.get(name='shanghai').author_set.values('name')
    #基于queryset --> 反向查询(按表名)
    models.City.objects.filter(name='shanghai').values('author__name')
    #基于queryset --> 正向查询(按字段)(返回queryset)
    models.Author.objects.filter(city__name='shanghai').values('name')
#查询海明威所在的城市
    #基于对象 --> 正向查询 (按字段) (返回object)
    models.Author.objects.get(name='haimingwei').city.name
    #基于queryset --> 反向查询(按表名) 
    models.City.objects.filter(author__name='haimingwei').values('name')
    ##基于queryset --> 正向查询(按字段)
    models.Author.objects.filter(name='haimingwei').values('city__name')
#3.跨表一对一查询
    #模型关系   作者 <-- 作者信息
#查询手机号为123的作者
    #基于对象 --> 正向查询 (按字段) (返回object)
    models.info.objects.get(telephone=123).author.name
    #基于queryset --> 正向查询(按字段)
    models.info.objects.filter(telephone=123).values('author__name')
    #基于queryset --> 反向查询(按表名)
    models.Author.objects.filter(info__telephone=123).values('name')
#查询haimingwei的手机号
    #基于对象 --> 反向查询 (按表名) (返回object!!!)
    models.Author.objects.get(name='haimingwei').info.telephone
    #基于queryset --> 正向查询(按字段)
    models.info.objects.filter(author__name='haimingwei').values('telephone')
    #基于queryset --> 反向查询(按表名)
    models.Author.objects.filter(name='haimingwei').values('info__telephone')
#查询写old man and sea这本书作者所在的城市 -->跨三张表查询!
    #models.City.objects.filter(author__book__title='old man and sea').values('name')
    #models.Book.objects.filter(title='old man and sea').values('author__city__name')
    #models.Author.objects.filter(book__title='old man and sea').values('city__name')
from django.db.models import Max,Avg,F,Q,Min,Count,Sum
#聚合查询 --> 返回一个字典
    models.info.objects.aggregate(total=Sum('telephone'))
#分组查询 -->不管是单表还是跨表一律都是基于queryset的查询
    #模型关系   城市 <-- 作者 <-- 书
#查询每个作者写的书籍总数 -->作者作为基表
    models.Author.objects.values('name').annotate(each_total=Count('book__title')).values('name','each_total')
    #查询每个作者写的书籍总数 -->书作为基表
    models.Book.objects.values('author__name').annotate(each_total=Count('title')).values('each_total')
#查询每本书的作者个数 
    models.Book.objects.values('title').annotate(total=Count('author__nid'))
    models.Author.objects.values('book__title').annotate(total=Count('nid'))
#查询不止一个作者的书籍
    models.Book.objects.values('nid').annotate(c=Count('author__nid')).filter(c__gt=1).values('title','c')
#F查询
    #比较不同字段值
    models.info.objects.filter(telephone__gt=F('nid'))
    models.info.objects.filter(telephone__gt=F('nid')*2)
    #修改字段值
    models.info.objects.update(telephone=F('telephone')*2).values('telephone')
#Q查询
    #查询xuewen或海明威所写的书
    models.Book.objects.filter(Q(author__name='haimingwei')|Q(author__name='xuewen')).values('title')
总结:
- 查询返回多个对象时,返回值为queryset;
- 基于对象反向查询时,表名_set!
- 确定返回一个对象时,返回值为object!
Django Models 查询操作的更多相关文章
- django models 数据库操作
		django models 数据库操作 创建模型 实例代码如下 from django.db import models class School(models.Model): pass class ... 
- django模型查询操作
		一旦创建好了数据模型,Django就会自动为我们提供一个数据库抽象API,允许创建.检索.更新和删除对象操作 下面的示例都是通过下面参考模型来对模型字段进行操作说明: from django.db i ... 
- Django—models相关操作
		一.在django后台admin管理页面添加自己增加的表结构 通过终端命令:python3 manage.py makemigrations, python3 manage.py migrate 我们 ... 
- django models数据库操作
		一.数据库操作 1.创建model表 基本结构 1 2 3 4 5 6 from django.db import models class userinfo(models.M ... 
- django之查询操作及开启事务
		目录 聚合查询 aggregate 聚合函数 分组查询 annotate F与Q查询 F查询 Q查询 ORM操作事务 django中开启事务 聚合查询 aggregate 操作外键字段管理数据的时候, ... 
- Django orm查询操作
		基于双下划线查询切记!!!!正向查询按字段,反向查询按表名的小写 正向:在Book表里设置关联Obj表,Book------>Obj就是正向查询 反向:在Book表里设置关联Obj表,Obj-- ... 
- Django ORM 查询操作
		queryset中支持链式操作 book=Book.objects.all().order_by('-nid').first() 只要返回的是queryset对象就可以调用其他的方法,直到返回的是对象 ... 
- Django 1.10 中文文档------3.2.2 查询操作making queries
		3.2.2 查询操作 6.15章节包含所有模型相关的API解释. 后面的内容基于如下的一个博客应用模型: from django.db import models class Blog(models. ... 
- 查询操作  -- Django从入门到精通系列教程
		该系列教程系个人原创,并完整发布在个人官网刘江的博客和教程 所有转载本文者,需在顶部显著位置注明原作者及www.liujiangblog.com官网地址. Python及Django学习QQ群:453 ... 
随机推荐
- ASP.NET Core中使用自定义MVC过滤器属性的依赖注入
			除了将自己的中间件添加到ASP.NET MVC Core应用程序管道之外,您还可以使用自定义MVC过滤器属性来控制响应,并有选择地将它们应用于整个控制器或控制器操作. ASP.NET Core中常用的 ... 
- C#版 - Leetcode49 - 字母异位词分组 - 题解
			C#版 - Leetcode49 - 字母异位词分组 - 题解 Leetcode49.Group Anagrams 在线提交: https://leetcode.com/problems/group- ... 
- 基于Twitter的Snowflake算法实现分布式高效有序ID生产黑科技(无懈可击)
			参考美团文档:https://tech.meituan.com/2017/04/21/mt-leaf.html Twitter-Snowflake算法产生的背景相当简单,为了满足Twitter每秒上万 ... 
- SpringBoot技术栈搭建个人博客【后台开发】
			前言:在之前,我们已经完成了项目的基本准备,那么就可以开始后台开发了,突然又想到一个问题,就是准备的时候只是设计了前台的RESTful APIs,但是后台管理我们同样也是需要API的,那么就在这一篇里 ... 
- 【Java】几道让你拿offer的知识点
			前言 只有光头才能变强 之前在刷博客的时候,发现一些写得比较好的博客都会默默收藏起来.最近在查阅补漏,有的知识点比较重要的,但是在之前的博客中还没有写到,于是趁着闲整理一下. 文本的知识点: Inte ... 
- 从零开始学安全(四十三)●Wireshark分析ICMP(IP)协议
			存活时间与IP分片 这里我们首先来研究一下关于IP协议的两个非常重要的概念:存活时间与IP分片.存活时间(TTL,Time to Live)用于定义数据包的生存周期,也就是在该数据包被丢弃之前,所能够 ... 
- PHP 二维数组排序保持键名不变
			对二维数组指定的键名排序,首先大家想到的是array_multisort函数,关于array_multisort的用法我之前也写了一篇废话不多言,我们看个实例: <?php $data = ar ... 
- Spring Boot 2.X 如何添加拦截器?
			最近使用SpringBoot2.X搭建了一个项目,大部分接口都需要做登录校验,所以打算使用注解+拦截器来实现,在此记录下实现过程. 一.实现原理 1. 自定义一个注解@NeedLogin,如果接口需要 ... 
- jQuery(五)、筛选
			1 过滤 1.eq(index | -index) 获取第N个元素,index为元素索引,-index值基于最后一个元素的位置(从 1 开始) 2.first() 获取第一个元素 3.last() 获 ... 
- VS Code怎样设置成中文
			打开 VS Code Ctrl + Shift +p打开搜索框 搜索框内输入Configure Display Language 回车 修改代码中“locale”后面引号内内容为zh-CH 重新启动V ... 
