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 查询操作的更多相关文章

  1. django models 数据库操作

    django models 数据库操作 创建模型 实例代码如下 from django.db import models class School(models.Model): pass class ...

  2. django模型查询操作

    一旦创建好了数据模型,Django就会自动为我们提供一个数据库抽象API,允许创建.检索.更新和删除对象操作 下面的示例都是通过下面参考模型来对模型字段进行操作说明: from django.db i ...

  3. Django—models相关操作

    一.在django后台admin管理页面添加自己增加的表结构 通过终端命令:python3 manage.py makemigrations, python3 manage.py migrate 我们 ...

  4. django models数据库操作

    一.数据库操作 1.创建model表         基本结构 1 2 3 4 5 6 from django.db import models     class userinfo(models.M ...

  5. django之查询操作及开启事务

    目录 聚合查询 aggregate 聚合函数 分组查询 annotate F与Q查询 F查询 Q查询 ORM操作事务 django中开启事务 聚合查询 aggregate 操作外键字段管理数据的时候, ...

  6. Django orm查询操作

    基于双下划线查询切记!!!!正向查询按字段,反向查询按表名的小写 正向:在Book表里设置关联Obj表,Book------>Obj就是正向查询 反向:在Book表里设置关联Obj表,Obj-- ...

  7. Django ORM 查询操作

    queryset中支持链式操作 book=Book.objects.all().order_by('-nid').first() 只要返回的是queryset对象就可以调用其他的方法,直到返回的是对象 ...

  8. Django 1.10 中文文档------3.2.2 查询操作making queries

    3.2.2 查询操作 6.15章节包含所有模型相关的API解释. 后面的内容基于如下的一个博客应用模型: from django.db import models class Blog(models. ...

  9. 查询操作 -- Django从入门到精通系列教程

    该系列教程系个人原创,并完整发布在个人官网刘江的博客和教程 所有转载本文者,需在顶部显著位置注明原作者及www.liujiangblog.com官网地址. Python及Django学习QQ群:453 ...

随机推荐

  1. 从壹开始前后端分离 [ vue + .netcore 补充教程 ] 二七║ Nuxt 基础:框架初探

    缘起 哈喽大家好,又是周四了,俗话说周四来了,周末还远么哈哈,老张我也想下周请假,来个16天的大长假哟,不知道大家是怎么请假的,近来发现文章下边已经没有人评论了,赶脚比较凄凉了,大家看到的麻烦点个赞呀 ...

  2. docker 搭建私有仓库 harbor

    前提 已安装好 docker 和  docker-compose 环境:CentOS Linux release 7.5 docker 版本:18.09.05 1.安装harbor wget -P / ...

  3. Android 8.0系统的应用图标适配

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 概述 参考资料<一起来学习Android 8.0系统的应用图标适配吧>中已经讲得很清楚了,这里我只是简单总结下.详情的内容请阅 ...

  4. DrawerLayoutDemo【侧边栏(侧滑菜单)简单实现】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 简单实现侧边栏(侧滑菜单)效果: 点击触发打开左侧侧边栏,手势滑动关闭左侧侧边栏: 手势滑动打开右侧侧边栏,手势滑动关闭右侧侧边栏: ...

  5. Ubuntu|ython3 :ImportError: cannot import name 'main'

    1.问题 root@stephen-K55VD:/usr/bin# pip3 Traceback (most recent call last): File "/usr/bin/pip3&q ...

  6. 手撸GitLab CI(阉割版)

    上一集我们说到如何从零开始搭建一个Vue-cli 3.0的项目,而这一集我们将说到如何手写一份阉割版的CI脚本. 首先说一下GitLab部署到服务器的操作,一般有两种,一种是规范化分离的,包含runn ...

  7. 制造业物料清单BOM、智能文档阅读、科学文献影响因子、"Celebrated Italian mathematician ZepartzatT Gozinto" 与 高津托图

    意大利数学家Z.高津托 意大利伟大数学家Sire Zepartzatt Gozinto的生卒年代是一个谜[1],但是他发明的 “高筋图” 在 制造资源管理.物料清单(BOM)管理.智能阅读.科学文献影 ...

  8. Linux用户组权限简单解析

    Linux的用户是以组为单位,每个用户都属于某一个组,而用户组的权限,是指某个用户对某个文件(文件夹)的操作权限,这里涉及用户组的概念. 其中root用户拥有全Linux系统中最高的权限,比任何其他用 ...

  9. Linux硬盘文件分析取证(SSH过的IP)

    在线靶场: https://www.mozhe.cn 背景介绍 某运维人员发现服务器最近被一个IP连接过SSH,请找到连接服务器SSH的IP. 实训目标 1.了解Linux备份方式: 2.了解Acce ...

  10. 升鲜宝V2.0_生鲜配送行业,对生鲜配送系统开发与实施的深度对比与思考_升鲜宝生鲜配送系统_15382353715_余东升

               升鲜宝V2.0_生鲜配送行业,对生鲜配送系统开发与实施的深度对比与思考_升鲜宝生鲜配送系统_15382353715_余东升 笔者从事生鲜配送软件开发接近10年,前前后后研究了很多 ...