ORM练习
# 书 class Book(models.Model): title = models.CharField(max_length=32) publish_date = models.DateField(auto_now_add=True) price = models.DecimalField(max_digits=5, decimal_places=2) memo = models.TextField(null=True) # 创建外键,关联publish publisher = models.ForeignKey(to="Publisher") # 创建多对多关联author author = models.ManyToManyField(to="Author") def __str__(self): return "<Book object: {} {}>".format(self.id, self.title) # 出版社 class Publisher(models.Model): name = models.CharField(max_length=32) city = models.CharField(max_length=32) def __str__(self): return "<Publisher object: {} {}>".format(self.id, self.name) # 作者 class Author(models.Model): name = models.CharField(max_length=32) age = models.IntegerField() phone = models.CharField(max_length=11) def __str__(self): return "<Author object: {} {}>".format(self.id, self.name)
""" 查找所有书名里包含金老板的书 查找出版日期是2018年的书 查找出版日期是2017年的书名 查找价格大于10元的书 查找价格大于10元的书名和价格 查找memo字段是空的书 查找在北京的出版社 查找名字以沙河开头的出版社 查找“沙河出版社”出版的所有书籍 查找每个出版社出版价格最高的书籍价格 查找每个出版社的书名以及出的书籍数量 查找作者名字里面带“小”字的作者 查找年龄大于30岁的作者 查找手机号是155开头的作者 查找手机号是155开头的作者的姓名和年龄 查找每个作者写的价格最高的书籍价格 查找每个作者的姓名以及出的书籍数量 查找书名是“跟金老板学开车”的书的出版社 查找书名是“跟金老板学开车”的书的出版社所在的城市 查找书名是“跟金老板学开车”的书的出版社的名称 查找书名是“跟金老板学开车”的书的出版社出版的其他书籍的名字和价格 查找书名是“跟金老板学开车”的书的所有作者 查找书名是“跟金老板学开车”的书的作者的年龄 查找书名是“跟金老板学开车”的书的作者的手机号码 查找书名是“跟金老板学开车”的书的作者们的姓名以及出版的所有书籍名称和价钱 """
#!/usr/bin/env python # -*- coding:utf8 -*- import os if __name__ == '__main__': os.environ.setdefault("DJANGO_SETTINGS_MODULE", "orm_ex.settings") import django django.setup() from app01 import models from django.db.models import Count, Min, Max, Sum, Avg from django.db.models import F,Q ''' 查找所有书名里包含金老板的书 查找出版日期是2018年的书 查找出版日期是2017年的书名 查找价格大于10元的书 查找价格大于10元的书名和价格 查找memo字段是空的书 ''' # book_obj = models.Book.objects.filter(title__contains="金老板") # print(book_obj) # book_obj = models.Book.objects.filter(publish_date__year=2018).values() # print(book_obj) # book_obj = models.Book.objects.filter(price__lt=10).values("title", "price") # print(book_obj) # # book_obj = models.Book.objects.filter(memo=None) # print(book_obj) ''' 查找在北京的出版社 查找名字以沙河开头的出版社 查找“沙河出版社”出版的所有书籍 查找每个出版社出版价格最高的书籍价格 查找每个出版社的书名以及出的书籍数量 ''' # pub_obj = models.Publisher.objects.filter(city="北京").values("name", "city") # pub_obj = models.Publisher.objects.filter(name__startswith="沙河") # print(pub_obj) # 法一 # book_obj = models.Book.objects.filter(publisher__name="沙河出版社").values() # 法二 # pub_obj = models.Publisher.objects.get(name="沙河出版社") # book_obj = models.Book.objects.filter(publisher=pub_obj).values() # print(book_obj) # 法一 # ret = models.Publisher.objects.annotate(max_price=Max("book__price")).values() # print(ret) # 法二 # ret = models.Book.objects.values("publisher__name").annotate(Max("price")) # print(ret) # ret = models.Publisher.objects.annotate(num_book=Count("book__title")) # for i in ret: # print(i.num_book, i.book_set.values("title")) """ 查找作者名字里面带“小”字的作者 查找年龄大于30岁的作者 查找手机号是155开头的作者 查找手机号是155开头的作者的姓名和年龄 """ # author_obj = models.Author.objects.filter(name__contains="苟").values() # print(author_obj) # ret = models.Author.objects.filter(age__gt=30).values() # print(ret) # ret = models.Author.objects.filter(phone__startswith=188).values("name", "age") # print(ret) """ 查找每个作者写的价格最高的书籍价格 查找每个作者的姓名以及出的书籍数量 """ # ret = models.Author.objects.annotate(max_price=Max("book__price")).values("name", "max_price") # print(ret) # ret = models.Author.objects.annotate(num_book=Count("book__title")).values("name", "num_book") # print(ret) """ 查找书名是“跟金老板学开车”的书的出版社 查找书名是“跟金老板学开车”的书的出版社所在的城市 查找书名是“跟金老板学开车”的书的出版社的名称 查找书名是“跟金老板学开车”的书的出版社出版的其他书籍的名字和价格 """ # 1 # ret = models.Publisher.objects.filter(book__title="跟金老板学开车") # print(ret) # ret = models.Book.objects.get(title="跟金老板学开车").publisher # print(ret) # 2 # ret = models.Publisher.objects.filter(book__title="跟金老板学开车")[0] # print(ret.city) # ret = models.Book.objects.get(title="跟金老板学开车").publisher # print(ret.city) # 4 查找书名是“跟金老板学开车”的书的出版社出版的其他书籍的名字和价格 # pub_obj = models.Book.objects.get(title="跟金老板学开车").publisher # ret = models.Book.objects.filter(~Q(title="跟金老板学开车") & Q(publisher=pub_obj)).values("title","price") # print(ret) """ 查找书名是“跟金老板学开车”的书的所有作者 查找书名是“跟金老板学开车”的书的作者的年龄 查找书名是“跟金老板学开车”的书的作者的手机号码 查找书名是“跟金老板学开车”的书的作者们的姓名以及出版的所有书籍名称和价钱 """ # ret = models.Author.objects.filter(book__title="跟金老板学开车") # print(ret) # ret = models.Author.objects.filter(book__title="跟金老板学开车").values("name", "age") # print(ret) # ret = models.Author.objects.filter(book__title="跟金老板学开车").values("name", "phone") # print(ret) author_obj_lst = models.Author.objects.filter(book__title="跟金老板学开车") for obj in author_obj_lst: ret = models.Book.objects.filter(author=obj).values("title", "price") print(obj.name, ret)
学无止境!

浙公网安备 33010602011771号