django学习第82天Django多表查询
Posted ye-hui
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了django学习第82天Django多表查询相关的知识,希望对你有一定的参考价值。
一.数据库表的创建
from app01 import models
# 多对多关系的字段无法直接添加,系统会自动创建第三表,需要在第三张表中添加(书和作者),一对一和一对多都一样
# models.Book.objects.create(name=‘西游记‘, price=88, publish_date=‘2018-09-12‘, publish_id=1)
# models.Book.objects.create(name=‘三国演义‘, price=32, publish_date=‘2018-07-12‘, publish_id=2)
# models.Book.objects.create(name=‘红楼梦‘, price=60, publish_date=‘2018-08-10‘, publish_id=2)
# models.AuthorDatail.objects.create(telephone=110,birthday=‘2018-6-10‘,addr=‘浦东‘)
# models.AuthorDatail.objects.create(telephone=111,birthday=‘2018-7-10‘,addr=‘杭州‘)
# models.AuthorDatail.objects.create(telephone=119,birthday=‘2015-9-15‘,addr=‘合肥‘)
# models.AuthorDatail.objects.filter(addr=‘浦东‘).update(telephone=155)
# models.AuthorDatail.objects.filter(pk=1).update(addr=‘上海‘)
# models.Author.objects.create(name=‘小猴‘,age=16,author_detail_id=1)
# models.Author.objects.create(name=‘egon‘,age=36,author_detail_id=2)
# models.Author.objects.create(name=‘陈威‘,age=26,author_detail_id=3)
# models.Publish.objects.create(name=‘南京出版社‘,city=‘南京‘,email=‘[email protected]‘)
# models.Publish.objects.create(name=‘北京出版社‘,city=‘北京‘,email=‘[email protected]‘)
# 多对多添加:
# 一本书2个作者
# book=models.Book.objects.get(pk=1)
# author1=models.Author.objects.get(pk=1)
# author2=models.Author.objects.get(pk=2)
# book.authors.remove(author1,author2)
# book.authors.add(author1,author2)
# book.authors.set([author1,author2])
# 一本书一个作者
# book=models.Book.objects.get(pk=2)
# author1=models.Author.objects.get(pk=3)
# book.authors.add(author1)
# 一个作者两本书
# book=models.Book.objects.get(pk=3)
# author2=models.Author.objects.get(pk=1)
# book.authors.add(author2)
二.多表查询
基于对象的跨表查询(多次查询)
一对一:
-正向查询按字段
-反向查询按表名小写
一对多:
-正向查询按字段(正向查询一定会查出一个来)
-反向查询按表名小写_set.all()(返回结果是queryset对象)
多对多:
-正向查询按字段.all()(正向查询一定会查出多个来)
-反向查询按表名小写_set.all()(返回结果是queryset对象)
基于双下划线的跨表查询
-在filter和values中都可以做连表操作(也就是都可以写 __)
-正向查询按字段
-反向查询按表名小写
无论以谁做基表,没有效率之分
# 查找所有书名里包含红楼的书
# res=models.Book.objects.filter(name__contains=‘红楼‘)
# 查找出版日期是2017年的书
# res=models.Book.objects.filter(publish_date__year=‘2018‘)
# 查找出版日期是2017年的书名
# res=models.Book.objects.filter(publish_date__year=‘2018‘).values(‘name‘)
# 查找价格大于10元的书
# res=models.Book.objects.filter(price__gt=10)
# 查找价格大于10元的书名和价格
# res=models.Book.objects.filter(price__gt=10).values(‘name‘,‘price‘)
# 查找在北京的出版社
# res=models.Publish.objects.filter(city=‘北京‘).values(‘name‘)
# 查找作者名字里面带“小”字的作者
# res=models.Author.objects.filter(name__startswith=‘小‘).values(‘name‘)
# 查找年龄大于30岁的作者
# res=models.Author.objects.filter(age__gt=30).values(‘name‘)
# 查找手机号是155开头的作者
# res=models.AuthorDatail.objects.filter(telephone__startswith=‘155‘).values(‘author__name‘)
# 查找手机号是155开头的作者的姓名和年龄
# res=models.Author.objects.filter(author_detail__telephone__startswith=‘155‘).values(‘name‘,‘age‘)
# author_detail=models.AuthorDatail.objects.get(telephone=‘155‘)
# author=models.Author.objects.get(author_detail=author_detail)
# print(author.name)
# print(author.age)
# 查找书名是“红楼梦”的书的出版社
# res=models.Book.objects.filter(name=‘红楼梦‘).values(‘publish__name‘)
# 查找书名是“红楼梦”的书的出版社所在的城市
# res=models.Publish.objects.filter(book__name=‘红楼梦‘).values(‘city‘)
# 查找书名是“红楼梦”的书的出版社的名称
# res=models.Publish.objects.filter(book__name=‘红楼梦‘).values(‘name‘)
# book=models.Book.objects.get(name=‘红楼梦‘)
# author_detail=models.Author.objects.get(book=book).author_detail
# print(author_detail.addr)
# 查找书名是“西游记”的书的所有作者
# res=models.Book.objects.filter(name=‘西游记‘).values(‘authors__name‘)
# 查找书名是“西游记”的书的作者的年龄
# res=models.Author.objects.filter(book__name=‘西游记‘).values(‘age‘)
# 查找书名是“红楼梦”的书的作者的手机号码
# res=models.Author.objects.filter(book__name=‘红楼梦‘).values(‘author_detail__telephone‘)
# 查找书名是“红楼梦”的书的作者的地址
# res=models.Author.objects.filter(book__name=‘红楼梦‘).values(‘author_detail__addr‘)
# print(res)
# book=models.Book.objects.get(name=‘红楼梦‘)
# author_detail=models.Author.objects.get(book=book).author_detail
# print(author_detail.addr)
# 查找书名是“红楼梦”的书的作者的邮箱
# res=models.Author.objects.filter(book__name=‘红楼梦‘).values(‘book__publish__email‘)
以上是关于django学习第82天Django多表查询的主要内容,如果未能解决你的问题,请参考以下文章
Django 06 Django模型基础2 (常用查询和多表关联)