标签:rom 作者 执行 单表查询 引用 三国 lis 城市 book
基于对象的跨表查询
、基于双下划线的跨表查询
、聚合查询
、F与Q查询
以及分组查询
。https://www.cnblogs.com/paulwhw/p/9395085.html
https://www.cnblogs.com/paulwhw/p/9405168.html
子查询
的语句,也就是说我们利用一个查询的结果作为另外一个查询的条件进行查询。数据库中的一个表记录其实就是筛选出来的“对象”的一个对象————可以利用.操作符操作。Book
表与Publish
表就是一对多
的关系:一本书只能有一个出版社,而同一个出版社可以出版多本书。正向查询按字段;反向查询按表名小写_set.all()
。以Book表为基准,由于我们将关联的字段定义在了Book表中,也就是说“关联字段”在Book表中,所以从Book开始查是“正向”,从Publish开始查是“反向”。正向查询
的例子:查询主键为1的书籍的出版社的城市book_obj = Book.objects.filter(pk=1).first()
ret = book_obj.publish.city
print(ret)
publish_obj = Publish.objects.filter(name=‘苹果出版社‘).first()
book_list = publish.book_set.all()
for book_obj in book_list:
print(book_obj.title)
Book
表与Author
表,就是“多对多”的关系。正向查询按字段;反向查询按表名小写_set.all()
。以Book表为基准,由于我们将关联的字段定义在了Book表中,也就是说“关联字段”在Book表中,所以从Book开始查是“正向”,从Author开始查是“反向”。book_obj = Book.objects.filter(title=‘三国群英‘).first()
authors = book_obj.authors.all()
for author_obj in authors:
name = author_obj.name
##手机号在“作者详细表”中,而且“作者表”相对于“作者详细表”是正向,关联字段为authordetail
telephone = author_obj.authordetail.telephone
print(‘作者:%s,手机号:%s‘%(name,telephone))
author_obj = Author.objects.filter(name=‘whw‘).first()
book_list = author_obj.book_set.all()
for book_obj in book_list:
print(book_obj.title)
Author
表与AuthorDetail
表是一对一的关系。author = Author.objects.filter(name=‘whw‘).first()
##正向查询按字段
ret = author.authordetail.telephone
print(ret)
add = AuthorDetail.objects.filter(telephone=12312312).first()
#反向查询按表名小写:
print(add.author.name)
查询规则
——正向查询按字段,反向查询按表名小写——用来告诉ORM引擎join哪张表。其实本质上就是先join成一张表,再执行“单表查询”。这里还需要注意的一点是:查询中用到的APIvalues()
等同于SQL语句中的select;filter()
等同于SQL语句中的where。Book
与Publish
表为例。需要注意的是,正向查询按字段,反向查询按表名小写用来告诉ORM引擎join哪张表。基于双下滑先的跨表查询在实际中用的非常多!
select publish.name from book inner join publish
on book.publish_id = publish.nid
where book.title=‘水浒传‘
ret = Book.objects.filter(title=‘水浒传‘).values(‘publish__name‘)
print(ret)
ret = Publish.objects.filter(book__title=‘水浒传‘).values(‘name‘)
print(ret)
Book
与Author
表为例。需要注意的是,正向查询按字段,反向查询按表名小写用来告诉ORM引擎join哪张表。Book
、Author
、book_authors
。但是第三张表我们是用Django在Book
中与Author
建立关联生成的表,也就是说:Book查Author是“正向查询”,Author查Book是“反向查询”。select author.name from book inner join book_authors
on book.nid = book_author.book_id
inner join author
on book_authors.author_id = author.nid
where book.title = "三国群英"
ret = Book.objects.filter(title=‘三国群英‘).values(‘authors__name‘)
print(ret)
ret = Author.objects.filter(book__title=‘三国群英‘).values(‘name‘)
print(ret)
ret = Author.objects.filter(name=‘whw‘).values(‘authordetail__telephone‘)
print(ret)
ret = AuthorDetail.objects.filter(author__name=‘whw‘).values(‘telephone‘)
print(ret)
from django.db.models import Max,Min,Avg,Count
from django.db.models import Avg,Max
ret = Book.objects.all().aggregate(avg_price=Avg(‘price‘),max_price=Max(‘price‘))
print(ret)
from django.db.models import F
ret = Book.objects.filter(content_num__gt=F(‘read_num‘)).values(‘title‘)
print(ret)
Book.objects.all().update(price=F(‘price‘)+10)
from django.db.models import Q
ret = Book.objects.filter(Q(title__startswith=‘三国‘)|Q(price=100)).values(‘title‘)
print(ret)
ret = Book.objects.filter(~Q(title__startswith=‘三国‘)).values(‘title‘)
print(ret)
ret = Book.objects.filter(~Q(title__startswith=‘三国‘),title__startswith=‘水‘).values(‘title‘)
print(ret)
分组查询
的思想跟我们SQL中group by
的思路是一模一样的,也就是说,我们先按照某个字段为数据进行分组,然后再进行进一步的查询。emp
,包含的字段有——:id、name、age、salary、dep(部门名)、province(省份)。models.py文件的类这样写:class Emp(models.Model):
name = models.CharField(max_length=32)
age = models.IntegerField()
salary = models.DecimalField(max_digits=8,decimal_places=2)
dep = models.CharField(max_length=32)
province = models.CharField(max_length=32)
单表模型.objects.values(‘group by的字段‘).annotate(聚合函数(‘统计字段‘))
from django.db.models import Avg
ret = Emp.objects.values(‘dep‘).annotate(Avg(‘salary‘))
print(ret)
在单表分组下,按着主键进行分组是没有任何意义的
!这与我们SQL中是一样的道理。每一个后表模型.objects.values(‘pk‘).annotate(聚合函数(‘关联表__统计字段‘)).values(‘表模型的所有字段以及统计字段‘)
select author.name,Max(book.price) from book inner join book_authors
on book.nid = book_authors.book_id
inner join author
on autohr.nid = book_authors.author_id
group by author.nid
ret = Author.objects.values(‘pk‘).annotate(max_price=Max(‘book__price‘)).values(‘name‘,‘max_price‘)
print(ret)
标签:rom 作者 执行 单表查询 引用 三国 lis 城市 book
原文地址:https://www.cnblogs.com/paulwhw/p/9420594.html