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如何跨表查询

Django 06 Django模型基础2 (常用查询和多表关联)

django之多表查询

[Django框架之ORM操作:多表查询,聚合查询分组查询F查询Q查询choices参数]

Django模型层:单表多表操作F与Q查询

Django ORM 一对多表的创建