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)

 

转载于:https://www.cnblogs.com/icemonkey/p/10511447.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值