Django进阶Model篇006 - 多表关联查询
接着前面的例子,举例多表查询实例如下:
1.查询作战的所有完整信息。
>>> AuthorDetail.objects.values('sex','email','address','birthday','author__name')
2.查询《持续集成实践》这本书的作者姓名,还有出版社的名字
>>> Book.objects.filter(title='持续集成实践').values('authors__name','publisher__name')
3.查询潘晓明写了一些什么书
>>> Book.objects.filter(authors__name='潘晓明').values('title')
4.查询机械工业出版社都出版了一些什么书籍
>>> Book.objects.filter(publisher__name='机械工业出版社').values('title')
>>> publisher = Publisher.objects.get(name='机械工业出版社') >>> publisher.book_set.all().values('title')
5.查询机械工业出版社都有哪些作者出过书
>>> Book.objects.filter(publisher__name='机械工业出版社').values('title','authors__name')
多表查询技巧:
__:两个下划线可以生成连接查询,查询关联的字段信息
_set:提供了对象访问相关联表数据的方法。但这种方法只能是相关类访问定义了关系的类(主键类访问外键类)。
ManyToMany
多对多之查询:
正向查询:查询书籍id=1的所有作者
b1=Book.objects.get(id=1)
b1.authors.all()
反向查询:查询id=3的作者所出版的所有书籍
a1=Author.objects.get(id=3)
a1.book_set.all()
正向联表查询:查询书籍id=1的所有作者
Book.objects.filter(id=1).values('authors__name')
反向联表查询:查询id=3的作者所出版的所有书籍
Author.objects.filter(id=3).values('book__title')
多对多添加:
正向添加:
b1=Book.objects.get(id=1) a1=Author.objects.get(id=2) b1.authors.add(a1) #可以直接添加obj b1.authors.add(3) #可以直接添加id au_list=Author.objects.all() b1.authors.add(*au_list) #可以直接添加obj列表 b1.authors.add(*[1,2,3]) #可以直接添加id列表
反向添加:
a2=Author.objects.get(id=1) b2=Book.objects.get(id=2) a2.book_set.add(b2) a2.book_set.add(3) a2.book_set.add(*Book.objects.all()) a2.book_set.add(*[1,2,3,4])
多对多删除:
多对多的删除有两个参数:
- clear() 清空数据
- remove() 删除数据
正向删除:
# 删除id=1的书籍的所有作者 b1=Book.objects.get(id=1) b1.authors.clear() # 删除id=2的书籍的作者id=1,2,5 b2=Book.objects.get(id=2) b2.authors.remove(1) b2.authors.remove(*[2,5])
反向删除:
# 删除作者id=1的所有书籍 a1=Author.objects.get(id=1) a1.book_set.clear()
***微信扫一扫,关注“python测试开发圈”,了解更多测试教程!***