6.ForeignKey 相关操作

1.正向查找

正向查找:那么什么是正向查找,我们知道对于一对多或者多对一的情况,我们一般将ForeignKey设置在多的一边,比如我们的书籍与出版社一般是多对一的,所以当书籍去找出版社的时候就是正向查找.

正向查找分为: 对象查找 字段查找

1.对象查找

#语法:对象.关联字段.字段  ----->对象加关联字段再加上字段

book_obj = models.Book.objects.first()  # 第一本书对象,先拿到对象。
print(book_obj.publisher) # 得到这本书关联的出版社对象,拿到关联的字段,也就是publisher。
print(book_obj.publisher.name) # 得到出版社对象的名称,其实拿到关联字段之后就相当于拿到了publisher这个对象,然后再通过name字段取我们的publisher中的出版社name。

2.字段查找(常用)

# 关联字段__字段  通过关联字段其实拿到我们要查询的表,然后通过双下划綫“__”加上要查询表的字段name。

print(models.Book.objects.values_list("publisher__name")) #这里双下划线其实类似于一个桥梁,连接起来两个表。

2.反向查找

反向查找:是与正向查找相反的,也就是说他是基于出版社来查找我们的书籍表。

1.对象查找

#  obj.表名_set -->  先拿到我们当前表的第一个对象,然后通过对象表名加“__”双下划綫的形式,找到对应的所有记录。

publisher_obj = models.Publisher.objects.first()  # 找到第一个出版社对象
books = publisher_obj.book_set.all() # 找到第一个出版社出版的所有书
titles = books.values_list("title") # 找到第一个出版社出版的所有书的书名

2.字段查找

#  表名__字段 --> 直接对象表名加“__”加上需要查询的字段的名字。
titles = models.Publisher.objects.values_list("book__title")
7.ManyToManyField

关联管理器"是在一对多或者多对多的关联上下文中使用的管理器

存在于下面两种情:

  • 外键关系的反向查询
  • 多对多关联关系
简单来说就是当 点后面的对象 可能存在多个的时候就可以使用以下的方法

方法


create()

# 创建一个新的对象,保存对象,并将它添加到关联对象集之中,返回新创建的对象
import datetime author_obj = models.Author.objects.first().book_set.create(title="番茄物语", publish_date=datetime.date.today()) # book_set 后面的 create 就是创建了一个 book对象实例

add()

# 把指定的model对象添加到关联对象集中

author_objs = models.Author.objects.filter(id__lt=3)  # 多个对象

models.Book.objects.first().authors.add(*author_objs)

#  添加ID list

models.Book.objects.first().authors.add(*[1, 2])

set()

更新model对象的关联对象  删除所有的关系 添加新的关系
book_obj = models.Book.objects.first()
book_obj.authors.set([2, 3])

remove()

# 从关联对象集中移除执行的model对象

book_obj = models.Book.objects.first()

# 把 book_obj的author 所有对象中 移除id = 3 的author对象
book_obj.authors.remove(3)

clear()

#  从关联对象集中移除一切对象

book_obj = models.Book.objects.first()
book_obj.authors.clear() # 移除全部authors 对象
注意:

对于ForeignKey对象,clear()和remove()方法仅在null=True时存在

example

# 没有设置null = True 的时候
class Book(models.Model):
title = models.CharField(max_length=32)
publisher = models.ForeignKey(to=Publisher)
# 没有clear()和remove()方法 >>> models.Publisher.objects.first().book_set.clear()
Traceback (most recent call last):
File "<input>", line 1, in <module>
AttributeError: 'RelatedManager' object has no attribute 'clear' # 当ForeignKey字段设置null=True时 class Book(models.Model):
name = models.CharField(max_length=32)
publisher = models.ForeignKey(to=Class, null=True) # 此时就有clear()和remove()方法
>>> models.Publisher.objects.first().book_set.clear()
## OK

注意

对于所有类型的关联字段,add()、create()、remove()和clear(),set()都会马上更新数据库。换句话说,在关联的任何一端,都不需要再调用save()方法

8.聚合查询和分组查询
聚合:使用聚合函数对我们查询的结果进行进一步操作

简单的使用

  • 聚合其实类似于我们的SQL语句,其中在链表查询的时候也用到了聚合函数。

  • aggregate()是QuerySet 的一个终止子句,意思是说,它返回一个包含一些键值对的字典。

  • 键的名称是聚合值的标识符,值是计算出来的聚合值。键的名称是按照字段和聚合函数的名称自动生成出来的。

  • 用到的内置函数

from django.db.models import Avg, Sum, Max, Min, Count

example


from django.db.models import Avg, Sum, Max, Min, Count
models.Book.objects.all().aggregate(Avg("price")) {'price__avg': 13.233333}

如果你想要为聚合值指定一个名称,可以向聚合子句提供它。

models.Book.objects.aggregate(average_price=Avg('price'))

{'average_price': 13.233333}

#  如果你希望生成不止一个聚合,你可以向aggregate()子句中添加另一个参数。所以,如果你也想知道所有图书价格的最大值和最小值,可以这样查询:

models.Book.objects.all().aggregate(Avg("price"), Max("price"), Min("price"))
{'price__avg': 13.233333, 'price__max': Decimal('19.90'), 'price__min': Decimal('9.90')}
9.分组查询

# 统计每一本书的作者个数
book_list = models.Book.objects.all().annotate(author_num=Count("author"))
for obj in book_list:
print(obj.author_num) # 打印每一本书的作者个数 # 统计出每个出版社买的最便宜的书的价格 1.
publisher_list = models.Publisher.objects.annotate(min_price=Min("book__price"))
for obj in publisher_list:
print(obj.min_price) 2.
models.Book.objects.values("publisher__name").annotate(min_price=Min("price")) <QuerySet [{'publisher__name': '沙河出版社', 'min_price': Decimal('9.90')}, {'publisher__name': '人民出版社', 'min_price': Decimal('19.90')}]> # 统计不止一个作者的图书 models.Book.objects.annotate(author_num=Count("author")).filter(author_num__gt=1)
<QuerySet [<Book: 番茄物语>]> # 根据一本图书作者数量的多少对查询集 QuerySet进行排序 models.Book.objects.annotate(author_num=Count("author")).order_by("author_num") <QuerySet [<Book: 香蕉物语>, <Book: 橘子物语>, <Book: 番茄物语>]> # 查询各个作者出的书的总价格 models.Author.objects.annotate(sum_price=Sum("book__price")).values("name", "sum_price")
<QuerySet [{'name': '小精灵', 'sum_price': Decimal('9.90')}, {'name': '小仙女', 'sum_price': Decimal('29.80')},
{'name': '小魔女', 'sum_price': Decimal('9.90')}]>

Django ORM-02的更多相关文章

  1. django orm总结[转载]

    django orm总结[转载] 转载地址: http://www.cnblogs.com/linjiqin/archive/2014/07/01/3817954.html 目录1.1.1 生成查询1 ...

  2. Django ORM - 001 - 外键表查询主表信息

    开始用Django做web开发,我想大家都会遇到同样的问题,那就是如何高效快速的查询需要的数据,MVC都很简单,但是ORM折腾起来就有些费时间,我准备好好研究下Django ORM,所以会有一个系列的 ...

  3. Django ORM 中的批量操作

    Django ORM 中的批量操作 在Hibenate中,通过批量提交SQL操作,部分地实现了数据库的批量操作.但在Django的ORM中的批量操作却要完美得多,真是一个惊喜. 数据模型定义 首先,定 ...

  4. Django ORM 查询管理器

    Django ORM 查询管理器 ORM 查询管理器 对于 ORM 定义: 对象关系映射, Object Relational Mapping, ORM, 是一种程序设计技术,用于实现面向对象编程语言 ...

  5. Django ORM模型的一点体会

    作者:Vamei 出处:http://www.cnblogs.com/vamei 严禁转载. 使用Python的Django模型的话,一般都会用它自带的ORM(Object-relational ma ...

  6. 数据库表反向生成(二) Django ORM inspectdb

    在前一篇我们说了,mybatis-generator反向生成代码. 这里我们开始说如何在django中反向生成mysql model代码. 我们在展示django ORM反向生成之前,我们先说一下怎么 ...

  7. Django ORM那些相关操作

    一般操作 https://docs.djangoproject.com/en/1.11/ref/models/querysets/         官网文档 常用的操作 <1> all() ...

  8. django orm 及常用参数

    一些说明: 表myapp_person的名称是自动生成的,如果你要自定义表名,需要在model的Meta类中指定 db_table 参数,强烈建议使用小写表名,特别是使用MySQL作为后端数据库时. ...

  9. Django ORM中,如何使用Count来关联对象的子集数量

    示例models 解决方法 有时候,我们想要获取一个对象关联关系的数量,但是我们不要所有的关联对象,我们只想要符合规则的那些关联对象的数量. 示例models # models.py from dja ...

  10. Django ORM存储datetime 时间误差8小时问题

    今天使用django ORM 将获取到的时间入库,并未出现问题,但是后来发现时间晚了8小时,经查询Django官方文档发现获取本地时间和UTC时间有差别. 首先科普下:UTC是协调世界时 UTC相当于 ...

随机推荐

  1. 学习gulpfile.babel.js随笔

    'use strict' import gulp from 'gulp' //将gulp插件包含进来 import sass from 'gulp-sass' //编译sass文件 import im ...

  2. Vue.js组件设计原则

    页面上把每个独立可以交互的区域视为一个组件 每个组件对应一个工程目录,组件所需要的各种资源在这个目录下就近维护 页面不过是组件的容器,组件可以嵌套自由组合形成完整的页面

  3. bzoj1224

    题解: 暴力+剪纸 判断一下最大行不行,最小行不行 代码: #include<bits/stdc++.h> ; using namespace std; ],q; int n,m,x,y, ...

  4. checkbox选中的问题(Ajax.BeginForm)

    判断checkbox选中的方法方法一:if ($("#checkbox-id")get(0).checked) { // do something} 方法二:if($('#chec ...

  5. Python3 循环语句(十)

    Python中的循环语句有 for 和 while. Python循环语句的控制结构图如下所示: while 循环 Python中while语句的一般形式: while 判断条件: 语句 同样需要注意 ...

  6. 在CMD中使用for命令对单行字符串做分割的方法

    我们都知道CMD中的for命令是执行循环命令的,数据来源可以是一个文件,一个命令的结果或一个字符串,只有这3种来源 如果是一个文件则对这个文件的所有字符串进行循环处理 如果是一个命令结果,那么对这个命 ...

  7. centos7下的防火墙

    在cengos7下的防火墙是交给systemctl来管理服务和程序,包括了service和chkconfig. 查看firewalld.service 是否启动 systemctl stop fire ...

  8. L177 Arctic ice brings an understanding of ancient Europe’s economy

    Greenland's icy mountains are not an obvious place to search for an archive of economic history, but ...

  9. node 使用范围 和 node的优势 (为什么 创业公司 选择的不是 java php ruby 等)

    链接 一些国外大公司 范围: 第一: 希望合并后台多个接口 成为一个接口,  或者频繁改动接口 相关, 比如数据 和数据格式之类,  后台难以配合, 这里可以使用node作为后台的应用层调用其他接口 ...

  10. DDMS介绍

    DDMS全称:Dalvik Debug Monitor Service 一,DDMS的作用 它提供了截屏.查看线程和堆信息.logcat.进程.广播状态信息.模拟来电呼叫和短信.虚拟地理坐标等等. 二 ...