准备表
from django.db import models
# Create your models here.
class Publisher(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=32)
addr = models.CharField(max_length=32)
phone = models.IntegerField
def __str__(self):
return self.name
# 作者查书,设计到作者里面
class Author(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=16)
author_detail = models.OneToOneField("AuthorDetail")
# 多对多
books = models.ManyToManyField(to="Book")
def __str__(self):
return self.name
class Book(models.Model):
id = models.AutoField(primary_key=True)
title = models.CharField(max_length=6)
price = models.DecimalField(max_digits=5, decimal_places=2)
publish_day = models.DateField(auto_now_add=True)
# 书-出版社 多对一关联
publisher = models.ForeignKey(to="Publisher", to_field="id")
def __str__(self):
return self.title
class AuthorDetail(models.Model):
id = models.AutoField(primary_key=True)
city = models.CharField(max_length=32)
email = models.EmailField()
def __str__(self):
return self.city
普通查询练习
from app05 import models
import datetime
#查找所有书名里包含**的书
models.Book.objects.filter(title__contains="一")
<QuerySet [<Book: 书一>]>
#查找出版日期是2017年的书
models.Book.objects.filter(publish_day__year=2017)
<QuerySet [<Book: 书一>]>
#查找出版日期是2018年的书名
models.Book.objects.filter(publish_day__year=2018).values("title")
<QuerySet [{'title': '书二'}, {'title': '书三'}]>
#查找价格大于10元的书
models.Book.objects.filter(price__gt=10)
<QuerySet [<Book: 书一>, <Book: 书二>, <Book: 书三>]>
#查找价格大于10元的书名和价格
models.Book.objects.filter(price__gt=10).values("title","price")
<QuerySet [{'title': '书一', 'price': Decimal('111.12')}, {'title': '书二', 'price': Decimal('233.33')}, {'title': '书三', 'price': Decimal('233.33')}]>
查找字段title是空的书
models.Book.objects.filter(title__isnull=True)
<QuerySet []>
#查找名字以沙河开头的出版社
models.Publisher.objects.filter(name__startswith="国")
<QuerySet [<Publisher: 国贸>]>
#查找书名是**的书的出版社
models.Book.objects.get(title="书一").publisher
<Publisher: 沙河出版社>
#查找书名是**的书的出版社的名称
models.Book.objects.get(title="书一").publisher.name
'沙河出版社'
#查找书名是**的书的所有作者
models.Book.objects.get(title="书一").author_set.all()
<QuerySet [<Author: 小一>, <Author: 小三>]>
#查找书名是**的书的作者的名字
models.Book.objects.get(title="书一").author_set.all().values("name")
<QuerySet [{'name': '小一'}, {'name': '小三'}]>
简单示例
单表查询
查询书名为**的书
models.Book.objects.filter(title="书三")
<QuerySet [<Book: 书三>]>
一对多查询
查询id为1的书的出版社所在的城市
models.Book.objects.get(id=1).publisher.addr
'沙河地铁站'
查询id为1的出版社的出版的所有书籍(反向查找)
models.Book.objects.get(id=1).publisher.book_set.all()
<QuerySet [<Book: 书一>]>
一对一查询
查询**作者的邮箱
models.Author.objects.get(name="小一").author_detail.email
'1@1'
查询所有addr=”**”的作者姓名
tmp = models.AuthorDetail.objects.filter(city="北京").all()
for i in tmp:
print(i.author.name)
小一
小四
多对多查询
查询**所有作者的姓名和邮箱(正向查找)
models.Book.objects.get(title="书一").author_set.all()
<QuerySet [<Author: 小一>, <Author: 小三>]>
tmp = models.Book.objects.get(title="书一").author_set.all()
for i in tmp:
print(i.name)
小一
小三
查询某个人写的书
models.Author.objects.get(name="小一").books.all()
<QuerySet [<Book: 书一>, <Book: 书二>]>
双下划线
查询沙河出版社出版的所有书籍的名称和价格
#正向查询
models.Book.objects.filter(publisher__name="沙河出版社").values("title","price")
<QuerySet [{'title': '书一', 'price': Decimal('111.12')}, {'title': '书二', 'price': Decimal('233.33')}]>
#反向查询
models.Publisher.objects.get(name="沙河出版社").book_set.all().values("title","price")
<QuerySet [{'title': '书一', 'price': Decimal('111.12')}, {'title': '书二', 'price': Decimal('233.33')}]>
models.Publisher.objects.get(name="沙河出版社").book_set.all().values_list("title","price")
<QuerySet [('书一', Decimal('111.12')), ('书二', Decimal('233.33'))]>
#双下划线反查
models.Publisher.objects.filter(name="沙河出版社").values_list("book__title","book__price")
<QuerySet [('书一', Decimal('111.12')), ('书二', Decimal('233.33'))]>
查询小仙女出版的所有书籍名称
models.Author.objects.get(name="小一").books.all().values("title")
<QuerySet [{'title': '书一'}, {'title': '书二'}]>
models.Book.objects.filter(author__name="小一").values_list("title")
<QuerySet [('书一',), ('书二',)]>
查询沙河出版社出版的书籍的书名和作者姓名
models.Publisher.objects.get(name="沙河出版社").book_set.all().values("title")
<QuerySet [{'title': '书一'}, {'title': '书二'}]>
models.Book.objects.filter(publisher__name="沙河出版社").all().values("title")
<QuerySet [{'title': '书一'}, {'title': '书二'}]>
models.Publisher.objects.filter(name="沙河出版社").values("book__title")
<QuerySet [{'book__title': '书一'}, {'book__title': '书二'}]>
本例中的关联关系如下,如果改成ManyToManyField放在Book中
# 作者查书,设计到作者里面
class Author(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=16)
author_detail = models.OneToOneField("AuthorDetail")
# 多对多
books = models.ManyToManyField(to="Book")
def __str__(self):
return self.name
class Book(models.Model):
id = models.AutoField(primary_key=True)
title = models.CharField(max_length=6)
price = models.DecimalField(max_digits=5, decimal_places=2)
publish_day = models.DateField(auto_now_add=True)
# 书-出版社 多对一关联
publisher = models.ForeignKey(to="Publisher", to_field="id")
def __str__(self):
return self.title
修改后的测试(伪代码)
查询沙河出版社出版的所有书籍的名称和价格
(正向查)
models.Book.objects.filter(publisher__name="沙河出版社").values_list("title", "price")
<QuerySet [('番茄物语', Decimal('9.90')), ('香蕉物语', Decimal('9.90'))]>
反向查
models.Publisher.objects.get(name="沙河出版社").book_set.all().values_list("title", "price")
<QuerySet [('番茄物语', Decimal('9.90')), ('香蕉物语', Decimal('9.90'))]>
双下划线反查
models.Publisher.objects.filter(name="沙河出版社").values_list("book__title", "book__price")
<QuerySet [('番茄物语', Decimal('9.90')), ('香蕉物语', Decimal('9.90'))]>
查询小仙女出版的所有书籍名称
正向查
models.Book.objects.filter(author__name="小仙女").values_list("title")
<QuerySet [('番茄物语',), ('橘子物语',)]>
反向查
models.Author.objects.get(name="小仙女").book_set.all().values_list("title")
<QuerySet [('番茄物语',), ('橘子物语',)]>
双下划线反查
models.Author.objects.filter(name="小仙女").values_list("book__title")
<QuerySet [('番茄物语',), ('橘子物语',)]>
查询沙河出版社出版的书籍的书名和作者姓名
正向查
models.Book.objects.filter(publisher__name="沙河出版社").values_list("title", "author__name")
<QuerySet [('番茄物语', '小精灵'), ('番茄物语', '小仙女'), ('香蕉物语', '小魔女')]>
反向查
models.Publisher.objects.filter(name="沙河出版社").values_list("book__title", "book__author__name")
<QuerySet [('番茄物语', '小精灵'), ('番茄物语', '小仙女'), ('香蕉物语', '小魔女')]>
双下划线反向查
models.Publisher.objects.get(name="沙河出版社").book_set.all().values_list("title", "author__name")
<QuerySet [('番茄物语', '小精灵'), ('番茄物语', '小仙女'), ('香蕉物语', '小魔女')]>
补充
查询memo为空的所有书
models.Book.objects.filter(memo__isnull=True)