PYTHON第七十六天笔记12.11-星期一
一、自记录:
orm查询之...:
正向查询:从有关联字段的那一方开始查。
反向查询:从没有关联字段的那一方开始查。(一对一,多对多,关联字段放在哪一方都可以。但是,一对多是固定的,关联字段必须放在多的一方。)
二、课上笔记:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
跨表查询 class Book(models.Model): title = models.CharField(max_length=32) publishDate = models.DateField() price = models.DecimalField(max_digits=5, decimal_places=2) # 999.99 # 创建一对多的关联字段 : 是与某个书籍对象关联的出版社对象(注意,只有一个对象) publish=models.ForeignKey("Publish") # 创建的多对多的关系 authors=models.ManyToManyField("Author") class Publish(models.Model): nid = models.AutoField(primary_key=True) name=models.CharField( max_length=32) email=models.EmailField() class Author(models.Model): name=models.CharField(max_length=32) age=models.IntegerField() class AuthorDetail(models.Model): addr=models.CharField(max_length=32) email=models.EmailField() author=models.OneToOneField("Author") --------- 基于对象跨表查询(子查询) .publish ==== 一对多(Book----------------->Publish) <---------------- .book_set.all() 查询python这本书的出版社的名字 (正向查询,按字段) book_obj=Book.objects.get(title="python") print(book_obj.publish.name) 查询沙河出版社出版过的书籍名称 (反向查询按:表名_set) pub_obj=Publish.objects.get(name="人民出版社") print(pub_obj.book_set.all()) .authors.all() ==== 多对多(Book------------------->Author) <-------------------- .book_set.all() 查询python这本书的所有作者的名字 (正向查询,按字段) book_obj=Book.objects.get(title="python") print(book_obj.authors.all()) 查询alex出版过的所有书籍 (反向查询按:表名_set) author_obj=Author.objects.get(name="alex") print(author_obj.book_set.all()) # <QuerySet [<Book: 金瓶没4>, <Book: 金瓶没5>]> .author ==== 一对一(AuthorDetail--------------->Author) <---------------- .authordetail 查询的地址在烟台并且email是789的作者的名字 (正向查询,按字段) authordetail=AuthorDetail.objects.get(addr="烟台",email=789) print(authordetail.author.name) 查询文州的email (反向查询按:表名) wenhzou=Author.objects.get(name="文州") print(wenhzou.authordetail.email) # 123@qq.com # 查询住在沙河的作者出版过的所有书籍的名称以及出版社名称 author_obj=Author.objects.get(name="alex") print(author_obj.book_set.all()) # <QuerySet [<Book: 金瓶没4>, <Book: 金瓶没5>]> --------- 基于双下划线查询(join查询) ##########################基于双下划线的查询:正向查询,按字段;反向查询,按表名##################### # 查询沙河出版社出版过的书籍名称 # ret=Publish.objects.filter(name="人民出版社").values("book__title") # print(ret) # Book.objects.filter(publish__name="人民出版社").values("title") # email以456开头的作者出版过的所有书籍名称以及出版社名称 ret=Book.objects.filter(authors__authordetail__email__startswith="456").values("title","publish__name") print(ret) sql: SELECT "app01_book"."title", "app01_publish"."name" FROM "app01_book" INNER JOIN "app01_book_authors" ON ("app01_book"."id" = "app01_book_authors"."book_id") INNER JOIN "app01_author" ON ("app01_book_authors"."author_id" = "app01_author"."id") INNER JOIN "app01_authordetail" ON ("app01_author"."id" = "app01_authordetail"."author_id") INNER JOIN "app01_publish" ON ("app01_book"."publish_id" = "app01_publish"."nid") WHERE "app01_authordetail"."email" LIKE '456%' ESCAPE '\' LIMIT 21; args=('456%',) emp nid name age dep salary pro 1 蒋毅 23 运营部 50000 迪拜 2 远明 34 销售部 30000 沙河 3 雍熙 45 财务部 100000 河北 4 侯昂 34 销售部 40000 河北 5 大井 56 运营部 40000 迪拜 聚合函数: 所有员工的平均薪水: sql : select AVG(salary) from emp 分组: 查询每一个部门的平均薪水: sql: select AVG(salary) from emp group by dep; 查询每一省份的最高薪水 sql: select MAX(salary) from emp group by pro;
三、作业:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
基于图书管理系统的表关系与数据,进行如下查询
要求:1-5查询分别基于对象查询,双下划线查询,以及找到对应翻译的sql语句
1、查询人民出版社出版过的价格大于100的书籍的作者的email
2、查询alex出版过的所有书籍的名称以及书籍的出版社的名称
3、查询2011年出版社过的所有书籍的作者名字以及出版社名称
4、查询住在沙河并且email以123开头的作者写过的所有书籍名称以及书籍的出版社名称
5、查询年龄大于20岁的作者在哪些出版社出版过书籍
6、查询每一个出版社的名称以及出版过的书籍个数
7、查询每一个作者的名字以及出版的所有书籍的最高价格
8、查询每一本书的名字,对应出版社名称以及作者的个数
day76作业:
答案:1-5是基于对象和基于下划线两种查询:
1、
publi = Publish.objects.get(name="人民出版社").book_set.all()
for item in publi:
for i in item.author.all():
print(i.authorDetail.email)
print(Book.objects.filter(publish__name="人民出版社", price=199).values("author__authorDetail__email"))
2、
a = Author.objects.get(name="alex")
b = a.book_set.all()
for i in b:
print(i.title,i.publish.name)
A = Author.objects.filter(name="alex").values("book__title","book__publish__name")
print(a)
3、
b = Book.objects.filter(publish_date="2011")
for i in b:
print(i.author.name,i.publish.name)
a = Publish.objects.filter(book__publish_date__year=2011).values("name","book__author__name")
print(a)
4、
a = AuthorDetail.objects.filter(addr="沙河",email__startswith="111")
for b in a:
print(b.author.book_set.values_list("title","publish__name"))
a = AuthorDetail.objects.filter(addr="沙河",email__startswith="111").values("author__book__title","author__book__publish__name")
print(a)
5、
a = Author.objects.filter(age__gt=20)
for b in a:
print(b.book_set.values("publish__name").distinct())
a = Author.objects.filter(age__gt=20).values("book__publish__name").distinct()
print(a)
6、
from django.db.models import Count
b = Publish.objects.annotate(cc=Count("book__title"))
for bookobj in b:
print(bookobj.name,bookobj.cc)
7、
from django.db.models import Max
n =Author.objects.annotate(pr=Max("book__price"))
for obj in n:
print(obj.name,obj.pr)
8、
from django.db.models import Count
b = Book.objects.annotate(c=Count("author__id"))
for item in b:
print(item.title,item.publish.name,item.c)
四、图片:
1、正向查询
2、values查询取值操作(此可避免使用循环方式取)
3、