zoukankan      html  css  js  c++  java
  • Python学习第三十三课——ORM(多表查询,多对多)以及双下划线的用法(重要)

    除了modios.py和views.py其他都与前面的一样:

    modios.py

    要建立多对多的关系

    from django.db import models
    
    
    # Create your models here.
    
    
    # 一对多建表
    class Book(models.Model):  # 表名
        name = models.CharField(max_length=20)  # name字段
        price = models.IntegerField()  # 字段
        pub_date = models.DateField()  # 字段
        publish = models.ForeignKey("Publish", on_delete=models.CASCADE)  # Publish 是下面的类
    
        author = models.ManyToManyField("Author")  # 建立多对多的关系
    
        def __str__(self):
            return self.name
    
    
    class Publish(models.Model):
        # 一个出版社可以出多本书,按道理一般将外键建立到多的一方
        name = models.CharField(max_length=32)
        city = models.CharField(max_length=32)
    
        def __str__(self):
            return self.name
    
    
    class Author(models.Model):
        name = models.CharField(max_length=32)
        age = models.IntegerField(default=20)
    
        def __str__(self):
            return self.name

    views.py

    from django.shortcuts import render, HttpResponse
    
    from django.db.models import Avg, Min, Sum, Max, Count
    # Create your views here.
    from ap05.models import *
    
    from django.db.models import Q
    from django.db.models import F
    
    
    def index(request):
        return render(request, "index.html")
    
    def addbook(request):
    
        # # 方法三: 最简单的 (双下划线方法),适用于filter,values
        # ret = Book.objects.filter(publish__name="北京出版社").values("name", "price")  # publish 是创建的时候的外键字段
        # # print(ret)
        # # <QuerySet [{'name': 'JAVA', 'price': 60},
        # # {'name': 'C++', 'price': 130},
        # # {'name': 'C++', 'price': 130},
        # # {'name': 'GIS', 'price': 130},
        # # {'name': 'GIS', 'price': 130}]>
        #
        # # 查询python 的出版社
        # ret2 = Publish.objects.filter(book__name="python").values("name")  # book是类的名字
        # # print(ret2)  # <QuerySet [{'name': '中国邮电出版社'}]>
        #
        # ret3 = Book.objects.filter(name="python").values("publish__name")
        # # print(ret3)  # <QuerySet [{'publish__name': '中国邮电出版社'}]>
        #
        # # 查询在北京城市的出版社出版的书籍
        # ret4 = Book.objects.filter(publish__city="北京").values("name")
        # print(ret4)
        # # <QuerySet [{'name': 'JAVA'}, {'name': 'GIS'}, {'name': 'python'}]>
        #
        # ret5=Book.objects.filter(pub_date__lt="2017-01-01").values("name")
        # print(ret5)
        # # <QuerySet [{'name': 'C'}, {'name': 'C++'}, {'name': 'GIS'}]>
        #
        # return HttpResponse("添加成功")
        pass
    
    
    def update(request): pass
    
    
    def delete(request): pass
    
    
    def select(request):
        # # 方法二:反向查询
        # pub_obj = Publish.objects.filter(name="北京出版社")[0]
        # # print(pub_obj.book_set.all())  # <QuerySet [<Book: JAVA>, <Book: C++>, <Book: C++>, <Book: GIS>, <Book: GIS>]>
        # book_list = pub_obj.book_set.all().values("name", "price")
        #
        # return render(request, "index.html", {"book_list1": book_list})
    
        # 多对多查询
    
        # 先找到一本书,然后拿他的author  正向查找
        # book_obj=Book.objects.get(id=2)
        # #如果想看到对应的名字,需要在models中加入一个def
        # print(book_obj.author.all()) #<QuerySet [<Author: 丽>]>
    
        # 反向查找
        #
        # author_obj=Author.objects.get(id=1)
        #
        # print(author_obj.book_set.all()) # <QuerySet [<Book: python>, <Book: PHP>]>
    
        # 如果想向第三张表插入值的方式绑定关系:  手动创建第三张表(一般不用,太麻烦)
        # 通过对象的方式绑定关系  将id=6的书和ID=2的作者绑定
        # book_obj=Book.objects.get(id=6) # 先找出第六本书
        # author_obj=Author.objects.get(id=2)  # 再找出第二个作者
        # book_obj.author.add(author_obj) # 然后通过add方法绑定
    
        # 查询憨出过的书的名称和价格(双下划线多对多查询) author是创建字段
        # print(Book.objects.filter(author__name="憨").values("name","price","author__name"))
        # < QuerySet[{'name': 'python', 'price': 55}, {'name': 'PHP', 'price': 70}] >
    
        # 聚合函数和分组函数
        # 第一步:先导入 from django.db.models import Avg,Min,Sum,Max,Count
    
        ret = Book.objects.all().aggregate(Avg("price"))
        print(ret)  # {'price__avg': 63.0}
        # 求憨出的书的总价格
        sumprice = Book.objects.filter(author__name="").aggregate(Sum("price"))
        sumprice1 = Book.objects.filter(author__name="").aggregate(han_price=Sum("price"))
        print(sumprice)  # {'price__sum': 125}
        print(sumprice1)  # {'han_price': 125}
    
        # 分组函数
        # 找出来不同作者的书的价格 annorare 分组函数
        ret2 = Book.objects.values("author__name").annotate(Sum("price"))
        # print(ret2)
        # <QuerySet [{'author__name': '憨', 'price__sum': 125}, {'author__name': '丽'
        # , 'price__sum': 60}, {'author__name': '玫', 'price__sum': 10}, {'author__na
        # me': None, 'price__sum': 120}]>
    
        # 找出不同出版社中最便宜的那个书
    
        ret3 = Publish.objects.values("name").annotate(Min("book__price"))
        #print(ret3)
        # < QuerySet[{'name': '北京出版社', 'book__price__min': 60}, {'name': '上海出
        # 版社', 'book__price__min': 70}, {'name': '中国邮电出版社', '
        # book__price__min': 55}, {'name': '杭州出版社', 'book__price__min': 10}, {'name': '广东出版
        # 社', 'book__price__min': None}]>
    
        # F 查询 和 Q 查询
        # 先引入 from django.db.models import Q
        # from django.db.models import F
        # 把所有的书价格加十块钱
        #Book.objects.all().update(price=F("price") + 10)  # F("price") 拿到的才是所有书籍的价格
    
        # 模糊查询
        ret4 = Book.objects.filter(Q(name__contains="J"))
        #print(ret4) #<QuerySet [<Book: JAVA>, <Book: Jshu>]>
    
    
        # iterator()迭代器用法
        ret5=Book.objects.filter(price=220)
    
        ret5=ret5.iterator()
    
        for i in ret5:
            print(i.name)
        # python
        # JAVA
        # PHP
        # C
        # linux
        # Jshu
    
        return HttpResponse("查询成功")

    最后总结:

    model(数据库模型)------ORM-----
    
    
    表与表之间的关系(两张表)
    
         一对多
         
         多对多
         
         一对一
         
    
    
    ORM------object relation mapping     
    
    python的类
    
    
    
    
    class emp():
         
         id=。。。
         name=。。。     《======》      表
         salary=。。。
    
    
    e=emp() 
    
    e.id    
         
    --------------------
    
    单表操作
    
            表记录的添加
                 
                方式一:
                Book()
                b=Book(name="python基础",price=99,author="yuan",pub_date="2017-12-12")
                b.save()
                方式二:
                Book.objects.create()
                Book.objects.create(name="老男孩linux",price=78,author="oldboy",pub_date="2016-12-12")
    
    
            表记录的修改
                方式一:
                
                b=Book.objects.get(author="oldboy")
                b.price=120
                b.save()
                
                方式二:
                #update是QuerySet
                Book.objects.filter(author="yuan").update(price=999)
             
            表记录的删除:
                Book.objects.filter(author="oldboy").delete()
                
            表记录的查询(重点):
            
                    book_list = Book.objects.filter(id=2)
                    book_list=Book.objects.exclude(author="yuan").values("name","price")
                    
                    book_list=Book.objects.all()
                    book_list = Book.objects.all()[::2]
                    book_list = Book.objects.all()[::-1]
                    
                    #first,last,get取到的是一个实例对象,并非一个QuerySet的集合对象
                    book_list = Book.objects.first()
                    book_list = Book.objects.last()  
                    book_list = Book.objects.get(id=2)#只能取出一条记录时才不报错
                    
                    
                    ret1=Book.objects.filter(author="oldboy").values("name")
                    ret2=Book.objects.filter(author="yuan").values_list("name","price")
                    
                   
    
                    book_list= Book.objects.all().values("name").distinct()
                    book_count= Book.objects.all().values("name").distinct().count()
                   
                
                    模糊查询  双下划线__
    
                    book_list=Book.objects.filter(name__icontains="P").values_list("name","price")
                    book_list=Book.objects.filter(id__gt=5).values_list("name","price")
                    
     
          多表操作(一对多):
                   #添加记录
                   #publish_id=2
                   Book.objects.create(name="linux运维",price=77,pub_date="2017-12-12",publish_id=2)
                   
    
                   #publish=object
                   Book.objects.create(name="GO",price=23,pub_date="2017-05-12",publish=publish_obj)
                   
                   #查询记录(通过对象)
                   
                         正向查询:
                         book_obj=Book.objects.get(name="python")   
                         pub_obj=book_obj.publish----》书籍对象对应的出版社对象
                         pub_obj.name
                         反向查询:
                         pub_obj = Publish.objects.filter(name="人民出版社")[0]
                         pub_obj.book_set.all().values("name","price")
                         
                   #查询记录(filter values  双下划线__)
                         
                        #人民出版社出版过的书籍与价格
                        ret=Book.objects.filter(publish__name="人民出版社").values("name","price")
                        
                        #python这本书出版社的名字
                        ret2=Publish.objects.filter(book__name="python").values("name")
                        
                        #python这本书出版社的名字
                        ret3=Book.objects.filter(name="python").values("publish__name")
                        
                        #北京的出版社出版书的名字
                        ret4=Book.objects.filter(publish__city="北京").values("name")
                        
                        #2017年上半年出版过书的出版社的名字
                        ret5=Book.objects.filter(pub_date__lt="2017-07-01",pub_date__gt="2017-01-01").values("publish__name")
                        
                        
         多表操作(多对多): 
                         
                        创建多对多的关系 author= models.ManyToManyField("Author")(推荐)
                        
                        
                        书籍对象它的所有关联作者  obj=book_obj.authors.all()
                                绑定多对多的关系  obj.add(*QuerySet)   
                                                  obj.remove(author_obj)
                                                  
                                                  
                        如果想向第三张表插入值的方式绑定关系:  手动创建第三张表
    
                                # class Book_Author(models.Model):
                                #     book=models.ForeignKey("Book")
                                #     author=models.ForeignKey("Author")                    
                                Book_Author.objects.create(book_id=2,author_id=3)
                                
                        
                        掌握:通过 filter values (双下换线)进行多对多的关联查询(形式和一对多) 
  • 相关阅读:
    MYSQL索引
    MYSQL 外键 on语句 多表查询
    MYSQL用户管理
    MYSQL数据类型 表基本操作 表记录增删改 单表查询
    JQuery 引用方式
    JQuery 元素操作 each循环
    Android EditText方框验证码 短信验证码攻略
    android MVP模式介绍与实战
    一些不错的Android开源音视频播放器
    Android可伸缩布局-FlexboxLayout(支持RecyclerView集成)
  • 原文地址:https://www.cnblogs.com/pyhan/p/12453867.html
Copyright © 2011-2022 走看看