ORM

models:

from django.db import models

# Create your models here.

# 书
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、关键字传参to="Publisher"
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)

练习题操作:
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE","ORM_homework.settings")
import django
django.setup()
from app01 import models
from django.db.models import Q,Max,Min,Count,Sum,Avg
查找所有书名里包含金老板的书
ret = models.Book.objects.filter(title__contains="金老板")
结果:<QuerySet [<Book: <Book object: 1 跟金老板学开车>>, <Book: <Book object: 2 跟金老板学开潜艇>>]>

查找出版日期是2018年的书
ret = models.Book.objects.filter(publish_date__year="2018")
结果:<QuerySet [<Book: <Book object: 1 跟金老板学开车>>, <Book: <Book object: 3 跟老男孩学思想>>, <Book: <Book object: 4 跟egon学喊麦>>]>

查找出版日期是2017年的书名
ret = models.Book.objects.filter(publish_date__year="2017").values("title")
结果:<QuerySet [{'title': '跟金老板学开潜艇'}]>

查找价格大于10元的书
ret = models.Book.objects.filter(price__gt=10)
结果:<QuerySet [<Book: <Book object: 1 跟金老板学开车>>, <Book: <Book object: 3 跟老男孩学思想>>]>

查找价格大于10元的书名和价格
ret = models.Book.objects.filter(price__gt=10).values("title","price")
结果:<QuerySet [{'title': '跟金老板学开车', 'price': Decimal('12.90')}, {'title': '跟老男孩学思想', 'price': Decimal('39.99')}]>

查找memo字段是空的书
ret = models.Book.objects.filter(Q(memo__isnull=True)|Q(memo=""))
结果:<QuerySet [<Book: <Book object: 1 跟金老板学开车>>, <Book: <Book object: 2 跟金老板学开潜艇>>, <Book: <Book object: 3 跟老男孩学思想>>, <Book: <Book object: 4 跟egon学喊麦>>]>

查找在北京的出版社
查找名字以沙河开头的出版社
查找“沙河出版社”出版的所有书籍
查找每个出版社出版价格最高的书籍价格
ret = models.Book.objects.values("publisher").annotate(Max("price"))
结果:<QuerySet [{'publisher': 1, 'price__max': Decimal('12.90')}, {'publisher': 2, 'price__max': Decimal('39.99')}, {'publisher': 4, 'price__max': Decimal('0.99')}]>

查找每个出版社的名字以及出的书籍数量
ret = models.Book.objects.values("publisher__name").annotate(Count("pk"))
结果:<QuerySet [{'publisher__name': '沙河出版社', 'pk__count': 3}, {'publisher__name': '西二旗出版社', 'pk__count': 1}]>

查找作者名字里面带“小”字的作者
查找年龄大于30岁的作者
查找手机号是155开头的作者
查找手机号是155开头的作者的姓名和年龄
查找每个作者写的价格最高的书籍价格
ret = models.Book.objects.values("author").annotate(Max("price"))
结果:<QuerySet [{'author': 1, 'price__max': Decimal('12.90')}, {'author': 2, 'price__max': Decimal('12.90')}, {'author': 3, 'price__max': Decimal('39.99')}]>

查找每个作者的姓名以及出的书籍数量
ret = models.Author.objects.annotate(count=Count("book__title")).values("count","name")
结果:<QuerySet [{'name': '金老板', 'count': 2}, {'name': '小哪吒', 'count': 2}, {'name': 'Alex', 'count': 2}]>

查找书名是“跟金老板学开车”的书的出版社
查找书名是“跟金老板学开车”的书的出版社所在的城市
查找书名是“跟金老板学开车”的书的出版社的名称
查找书名是“跟金老板学开车”的书的出版社出版的其他书籍的名字和价格
pub_obj = models.Publisher.objects.filter(book__title="跟金老板学开车").first()
ret = pub_obj.book_set.exclude(title="跟金老板学开车").values("title","price")
结果:<QuerySet [{'title': '跟金老板学开潜艇', 'price': Decimal('9.99')}]>
查找书名是“跟金老板学开车”的书的所有作者
查找书名是“跟金老板学开车”的书的作者的年龄
查找书名是“跟金老板学开车”的书的作者的手机号码
查找书名是“跟金老板学开车”的书的作者们的姓名以及出版的所有书籍名称和价钱
authors = models.Author.objects.filter(book__title="跟金老板学开车")
for author in authors:
print(author.name)
for i in author.book_set.all().values("title","price"):
print(i)
结果: 金老板
{'title': '跟金老板学开车', 'price': Decimal('12.90')}
{'title': '跟金老板学开潜艇', 'price': Decimal('9.99')}
小哪吒
{'title': '跟金老板学开潜艇', 'price': Decimal('9.99')}
{'title': '跟金老板学开车', 'price': Decimal('12.90')}
posted @ 2019-12-27 17:29  干it的小张  阅读(145)  评论(0编辑  收藏  举报