跨表查询是分组查询的基础
一对多
一对多查询(Publish 与 Book)
正向查询(按字段:publish):关联属性字段所在的表查询被关联表的记录就是正向查询,反之就是反向查询
# 查询三国的书籍的出版社所在的城市 book_obj=Book.objects.filter(pk=1).first() # book_obj.publish 是主键为1的书籍对象关联的出版社对象,book对象.外键字段名称 print(book_obj.publish.city)
反向查询(按表名:book_set,因为加上_set是因为反向查询的时候,你查询出来的可能是多条记录的集合):
pub_obj=models.Publish.objects.get(name='人民出版社')
print(pub_obj.book_set.all())
# < QuerySet[ < Book: 三国 >, < Book: 三国2 >, < Book: 三国3 >, < Book: 三国4 >] >
book_lst=pub_obj.book_set.all()
# for book_obj in book_lst:
# print(book_obj.title)
print(book_lst[0].title)
# 三国
print(book_lst[0].price)
# 100.00
一对一
一对一查询(Author与AuthorDetail)
正向查询(按字段:authorDetail):
egon=Author.objects.filter(name="egon").first() print(egon.authorDetail.telephone) egon.authorDeail就拿到了这个对象,因为一对一找到的就是一条记录,注意写法:作者对象.字段名,就拿到了那个关联对象
反向查询(按表名:author):不需要_set,因为一对一正向反向都是找到一条记录
# 查询所有住址在北京的作者的姓名 authorDet=AuthorDetail.objects.filter(addr="beijing")[0] authorDet.author.name
多对多
多对多查询(Author与Book)
正向查询(按字段:authors):
1
2
3
4
5
6
|
# 金瓶眉所有作者的名字以及手机号 book_obj = Book.objects. filter (title = "金瓶眉" ).first() authors = book_obj.authors. all () for author_obj in authors: print (author_obj.name,author_obj.authorDetail.telephone) |
反向查询(按表名:book_set):
1
2
3
4
5
6
|
# 查询egon出过的所有书籍的名字 author_obj = Author.objects.get(name = "egon" ) book_list = author_obj.book_set. all () #与egon作者相关的所有书籍 for book_obj in book_list: print (book_obj.title) |
注意:
你可以通过在 ForeignKey() 和ManyToManyField的定义中设置 related_name 的值来覆写 FOO_set 的名称。例如,如果 Article model 中做一下更改:
1
|
publish = ForeignKey(Book, related_name = 'bookList' ) |
那么接下来就会如我们看到这般:
1
2
3
4
|
# 查询 人民出版社出版过的所有书籍 publish = Publish.objects.get(name = "人民出版社" ) book_list = publish.bookList. all () # 与人民出版社关联的所有书籍对象集合 |
在这里我们补充一点,因为你很快就要接触到了,那就是form表单里面的button按钮和form表单外面的button按钮的区别,form表单里面的button按钮其实和input type='submit'的标签是有同样的效果的,都能够提交form表单的数据,但是如果放在form表单外面的button按钮,那就只是个普通的按钮了。<button>提交</button>,还有一点,input type='submit'按钮放到form表单外面那就成了一个普通的按钮。