zoukankan      html  css  js  c++  java
  • Django 多表查询 聚合查询 分组查询 F查询 Q查询

        # --------------------------------------------------------------------------------------------------------
        # 三张表 出版社表 书籍表 作者表
        #
        # # 书籍表
        # class Book(models.Model):
        #     name = models.CharField(max_length=20)
        #     price = models.IntegerField()
        #     pub_date = models.DateField()
        #     publish = models.ForeignKey("Publish")
        #     #authors = models.ManyToManyField("Author") #一般创建多对多关系 自己也可以创建一个多对多表关系 推荐单建立一个多表 
        #   # authors 对应Author的id == authors_id authors.列名 能取到Author的数据
        #     def __str__(self):
        #         return self.name
        #
        #     class Meta:
        #         db_table = "Book"
        # # 出版社表
        # class Publish(models.Model):
        #     name = models.CharField(max_length=32)
        #     city = models.CharField(max_length=32)
        #
        #     def __str__(self):
        #         return self.name
        #
        #     class Meta:
        #         db_table = "Publish"
        # # 推荐自己创建一个多表 这种比较灵活
        # # class Book_Author(models.Model):
        # #     book=models.ForeignKey("Book")
        # #     author=models.ForeignKey("Author")
        # # 作者表
        # class Author(models.Model):
        #     name = models.CharField(max_length=32)
        #     age = models.IntegerField(default=20)
        #
        #     def __str__(self):
        #         return self.name
        #
        #     class Meta:
        #         db_table = "Author"
        # --------------------------------------------------------------------------------------------------------
    
    
    
        # --------------------------------------------------------------------------------------------------------
        # 多表关系 一对多操作
        # 添加数据
        # Book.objects.create(name="python", price=77, pub_date="2017-12-12", publish_id=2)
        #
        # publish_obj=Publish.objects.filter(name="人民出版社")[0]
        # Book.objects.create(name="GO",price=23,pub_date="2017-05-12",publish=publish_obj)
    
        # book_obj=Book.objects.get(name="python")  # 是一个对象
        # print(type(book_obj))
        # print(book_obj.name)
        # print(book_obj.pub_date)
        #
        # #一对多:book_obj.publish--------一定是一个对象
        # print(book_obj.publish.name)
        # print(book_obj.publish.city)
        # print(type(book_obj.publish))
        #
        # 查询人民出版社出过的所有书籍名字和价格
        # select name,price from Book where publish_id in (select id from Publish where name="人民出版社");
        # 方式一:
        # pub_obj = Publish.objects.filter(name="人民出版社")[0]
        # ret = Book.objects.filter(publish=pub_obj).values("name", "price")
        # print(ret)
    
        # 方式二
        # pub_obj = Publish.objects.filter(name="人民出版社")[0]
        # print(pub_obj.book_set.all().values("name","price"))
        # print(type(pub_obj.book_set.all()))
    
        # 方式三 推荐用这个 正向查询 神奇的双下划线 __
        # 通过 filter values (双下换线)进行多对多的关联查询(形式和一对多)
        #
        # 查询人民出版社出的书名 和 书的价格
        # SELECT `Book`.`name`, `Book`.`price` FROM `Book` INNER JOIN `Publish` ON (`Book`.`publish_id` = `Publish`.`id`) WHERE `Publish`.`name` = '人民出版社'
        # ret=Book.objects.filter(publish__name="人民出版社").values("name","price")
        # print(ret)
        #
        # python这本书出版社的名字 注意book要小写
        # select name from Publish where id in (select publish_id from Book where name="python");
        # SELECT `Publish`.`name` FROM `Publish` INNER JOIN `Book` ON (`Publish`.`id` = `Book`.`publish_id`) WHERE `Book`.`name` = 'python'
        # ret2 = Publish.objects.filter(book__name="python").values("name")
        # print(ret2)
        # ret3 = Book.objects.filter(name="python").values("publish__name")
        # print(ret3)
        #
        # 北京城市出的所有书
        # select name from Book where publish_id in (select id from Publish where city="bj")
        # SELECT `Book`.`name` FROM `Book` INNER JOIN `Publish` ON (`Book`.`publish_id` = `Publish`.`id`) WHERE `Publish`.`city` = 'bj'
        # ret4 = Book.objects.filter(publish__city="bj").values("name")
        # print(ret4)
    
        # 查询一段时间内出过书的出版社
        # SELECT `Publish`.`name` FROM `Book` INNER JOIN `Publish` ON (`Book`.`publish_id` = `Publish`.`id`) WHERE (`Book`.`pub_date` < '2017-07-01' AND `Book`.`pub_date` > '2017-01-01')
        # ret5=Book.objects.filter(pub_date__lt="2017-07-01",pub_date__gt="2017-01-01").values("publish__name")
        # print(ret5)
        # --------------------------------------------------------------------------------------------------------
    
    
    
        # --------------------------------------------------------------------------------------------------------
        # 多多关系 对对多操作
        # 通过对象的方式绑定关系
        # book_obj=Book.objects.get(id=3)
        # print(book_obj.authors.all())
        # print(type(book_obj.authors.all()))
    
        #查询id为2的作者出的书
        # author_obj=Author.objects.get(id=2)
        # print(author_obj.book_set.all())
    
        # 多表操作 增加数据
        # book_obj=Book.objects.get(id=37)
        # author_objs=Author.objects.all()
        # book_obj.authors.add(*author_objs)
    
        # 多表操作 删除数据
        # # book_obj.authors.remove(*author_objs)
        # book_obj.authors.remove(4)
    
        # 创建第三张表
        # Book_Author.objects.create(book_id=38,author_id=1)
        # Book_Author.objects.create(book_id=35,author_id=1)
        # Book_Author.objects.create(book_id=37,author_id=1)
    
        # 查找book id是36的作者
        # select name from Author where id in (select author_id from Book_Author where book_id = 35);
        # ret = Author.objects.filter(book_author__book__id="35")
        # obj_id = Book.objects.filter()
        # print(ret)

       # 外键找外键关联的表 直接用fk找
    # 没外键找和它有关联表用 外键的类_set找 注意 外键类小写 或者在外键上加上 related_name='自己的类名' 注意小写
    ret = Book.objects.get(id=36).authors.all().values("name") print(ret) # zhangsan出过的书籍名称及价格 # select name,price from Book where id in (select book_id from Book_Author where author_id in(select id from Author where name="zhangsan"))); # ret2=Book.objects.filter(book_author__author__name="zhangsan").values("name","price") # ret2=Book.objects.filter(authors__name="zhangsan").values("name","price") # print(ret2) # ret1 = Author.objects.get(name="zhangsan").book_set.values("name","price") ret1 = Author.objects.get(name="zhangsan").book_set.all() print(ret1) # 找出 linux运维 这本书的作者是谁 #SELECT `Author`.`name` FROM `Author` INNER JOIN `Book_Author` ON (`Author`.`id` = `Book_Author`.`author_id`) INNER JOIN `Book` ON (`Book_Author`.`book_id` = `Book`.`id`) WHERE `Book`.`name` = 'linux运维'; #select name from Author where id in (select author_id from Book_Author where book_id in (select id from Book where name = "linux运维"));; # ret = Author.objects.filter(book_author__book__name="linux运维").values("name") ret2 = Book.objects.get(name="linux运维").authors.all().values("name") print(ret2) # 聚合函数 aggregate # ret=Book.objects.all().aggregate(Avg("price")) # ret=Book.objects.all().aggregate(Sum("price")) # ret=Book.objects.filter(authors__name="alex").aggregate(alex_money=Sum("price")) # ret=Book.objects.filter(authors__name="alex").aggregate(Count("price")) # print(ret) # ret=Book.objects.values("authors__name").annotate(Sum("price")) # print(ret) # ret=Publish.objects.values("name").annotate(abc=Min("book__price")) # print(ret) # b=Book.objects.get(name="GO",price=77) # print(b) # Book.objects.all().update(price=F("price")+10) # ret=Book.objects.filter(Q(name__contains="G")) # print(ret) # ret=Book.objects.filter(Q(name="GO"),price=87) # print(ret) # ret=Book.objects.filter(price=200) # for i in ret: # print(i.price) # # Book.objects.all().update(price=200) # ret = Book.objects.filter(price=100) # for i in ret: # print(i.price) # if ret.exists(): # print("ok") # ret=ret.iterator() # print(ret) # # for i in ret: # print(i.name) # # for i in ret: # print(i.name)
  • 相关阅读:
    Azure 虚拟机安全加固整理
    AzureARM 使用 powershell 扩容系统磁盘大小
    Azure Linux 云主机使用Root超级用户登录
    Open edX 配置 O365 SMTP
    powershell 根据错误GUID查寻错误详情
    azure 创建redhat镜像帮助
    Azure Powershell blob中指定的vhd创建虚拟机
    Azure Powershell 获取可用镜像 PublisherName,Offer,Skus,Version
    Power BI 连接到 Azure 账单,自动生成报表,可刷新
    Azure powershell 获取 vmSize 可用列表的命令
  • 原文地址:https://www.cnblogs.com/icemonkey/p/10511447.html
Copyright © 2011-2022 走看看