PYTHON第七十六天笔记12.11-星期一

一、自记录:

orm查询之...:

  正向查询:从有关联字段的那一方开始查。

  反向查询:从没有关联字段的那一方开始查。(一对一,多对多,关联字段放在哪一方都可以。但是,一对多是固定的,关联字段必须放在多的一方。)

二、课上笔记:

跨表查询

     
        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;               
               

                         
课上笔记

 

三、作业:

基于图书管理系统的表关系与数据,进行如下查询
  要求: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、

 

posted @ 2017-12-11 14:59  主啊~  阅读(60)  评论(0编辑  收藏  举报