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)
答案

 

posted @ 2018-08-05 23:51  Mr.GLH  阅读(135)  评论(0)    收藏  举报
Top↑