from django.shortcuts import render,HttpResponse
# https://www.cnblogs.com/yuanchenqi/articles/8963244.html
from myapp import models
from django.db.models import Sum, Count, Avg, Max
def index(request):
return HttpResponse("OK")
def show_date(request):
# #####################基于对象查询(子查询)##############################
# 按字段(publish)
# 一对多 book -----------------> publish
# <----------------
# book_set.all()
# 正向按照字段查询
aa=models.Book.objects.filter(title="python").first()
cc= aa.publish.email
bb= aa.publish.city
dd=aa.publish.name
print(cc,bb,dd) # 11111 南京 南方出版社
# 一对多 book<----------------------------------publish # 反向查询按 表名小写_set.all()
publish_obj= models.Publish.objects.filter(name="四川出版社").first()
book_all=publish_obj.book_set.all() # <QuerySet [<Book: Book object (2)>, <Book: Book object (4)>]>
for i in book_all:
print(i.title) # java css
print("**************************************************")
# 按字段(authors.all())
# 多对多 book -----------------------> author
# <----------------
# book_set.all()
css=models.Book.objects.filter(title="css").first() # < QuerySet[ < Author: Authorobject(2) >, < Author: Authorobject(4) >] >
aut_all=css.authors.all()
for i in aut_all:
print(i.name,i.age) # 李四 33 哈哈 44
aut=models.Author.objects.filter(name="张三").first()
aut_book=aut.book_set.all()
print(aut_book) # <QuerySet [<Book: Book object (1)>, <Book: Book object (2)>, <Book: Book object (3)>]>
for i in aut_book:
print(i.title) # python java html
print("**************************************************")
# 按字段 authorDetail
# 一对一 author -----------------------> authordetail
# <----------------
# 按表名 author
aa=models.Author.objects.filter(name='李四').first()
bb=aa.authorDetail.telephone
ad= aa.authorDetail.addr
print(bb,ad) # 44444444 李四北京
# adr=models.AuthorDetail.objects.filter(addr="李四北京").first()
# po=adr.author.name
# print(po) # 李四
adr = models.AuthorDetail.objects.filter(addr="李四北京")
for ads in adr:
print(ads.author.name) # 李四
# 对应sql:
#
# select publish_id from Book where title="python"
# select email from Publish where nid = 1
# #####################基于queryset和__查询(join查询)############################
# 正向查询:按字段 反向查询:表名小写
# 查询python这本书籍的出版社的邮箱
ret=models.Book.objects.filter(title="python").values("publish__email") # 正向查询:按字段
print(ret) # < QuerySet[{'publish__email': '11111'}] >
print(ret.query)
# SELECT"myapp_publish"."email"FROM"myapp_book"INNERJOIN"myapp_publish"ON("myapp_book"."publish_id" = "myapp_publish"."nid")WHERE"myapp_book"."title" = python
ret1 = models.Publish.objects.filter(name="四川出版社").values("book__title") # 反向查询:表名小写
print(ret1,"AAAAAAAAAAAAA") # < QuerySet[{'book__title': 'java'}, {'book__title': 'css'}] > AAAAAAAAAAAAA
print(ret1.query) # 生成的sql语句
# SELECT "myapp_book"."title" FROM"myapp_publish"LEFT OUTERJOIN"myapp_book" ON("myapp_publish"."nid" = "myapp_book"."publish_id") WHERE"myapp_publish"."name" = 四川出版社
# 查询王五的手机号
# 方式1:
ret = models.Author.objects.filter(name="王五").values("authorDetail__telephone")
# 方式2:
models.AuthorDetail.objects.filter(author__name="王五").values("telephone")
# 查询手机号以151开头的作者出版过的书籍名称以及书籍对应的出版社名称
ret = models.Book.objects.filter(authors__authorDetail__telephone__startswith="151").values('title',"publish__name")
print(ret.query)
# 重庆出版社出版的书籍名称
# 方式1:
ret1 = models.Publish.objects.filter(name="重庆出版社").values("book__title")
print("111111111====>", ret1.query)
# 方式2:
ret2 = models.Book.objects.filter(publish__name="重庆出版社").values("title")
print("2222222222====>", ret2.query)
# #####################聚合函数############################
# 查看所有书籍的价格总和
r=models.Book.objects.all().aggregate(price=Sum("price"))
print(r) # {'price': Decimal('204000.00')}
# 查看所有作者的平均年龄
ae=models.Author.objects.all().aggregate(age=Avg("age"))
print(ae) # {'age': 30.75}
# #####################分组查询############################
rt=models.Author.objects.values("name")
print(rt) # < QuerySet[{'name': '张三'}, {'name': '李四'}, {'name': '王五'}, {'name': '哈哈'}] >
# 查询每一个作者的名字以及出版过价格最高的书籍
rc=models.Author.objects.values("name").annotate(max_p=Max("book__price")).values("name","max_p")
print(rc,"wwwwwwwwwwwww")
# <QuerySet [{'name': '哈哈', 'max_p': Decimal('60000.00')}, {'name': '张三', 'max_p': Decimal('80000.00')}, {'name': '李 四', 'max_p': Decimal('80000.00')}, {'name': '王五', 'max_p': Decimal('40000.00')}]>
# 查询每一个出版社出版的书籍平均价格
c=models.Publish.objects.values("name").annotate(aaa=Avg("book__price")).values("name","aaa")
print(c,"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")
# <QuerySet [{'name': '南方出版社', 'aaa': 20000.0}, {'name': '四川出版社', 'aaa': 70000.0}, {'name': '重庆出版社', 'aaa': 22000.0}]>
# 查询每一本书籍作者个数
co= models.Book.objects.values("title").annotate(aa=Count("authors__name")).values("title","aa")
print(co)
# <QuerySet [{'title': 'c++', 'aa': 0}, {'title': 'css', 'aa': 2}, {'title': 'html', 'aa': 3}, {'title': 'java', 'aa': 2}, {'title': 'python', 'aa': 2}]>
return HttpResponse("1111")