我们有四张表: person_publisher
person_book
person_author
person_author_book
接下来分别从正向查询(子表-->主表)和反向查询(主表-->子表)进行。
1.一对一
正向查询:查询book中id=2(python)对应的出版社
book_obj=models.Book.objects.get(id=2)
print(book_obj)
print(book_obj.publisher.name)
反向查询:查询publisher中id=1(清华大学出版社)对应的book
publisher_obj=models.Publisher.objects.get(id=1)
print(publisher_obj)
#类名_set.all()
print(publisher_obj.book_set.all())
2.一对多
正向查询:查询book中id=3(java)对应的出版社
book_obj=models.Book.objects.get(id=3)
print(book_obj)
print(book_obj.publisher.name)
反向查询:查询publisher中id=3(广州大学出版社)对应的book
publisher_obj=models.Publisher.objects.get(id=3)
print(publisher_obj)
print(publisher_obj.book_set.all())
那么,我们要是想查询python是由那几家出版社出版的(虽然一般只是一家) ,我们可以这样做:
book_obj=models.Book.objects.filter(title='python')
print(book_obj)
for i in book_obj:
print(i.publisher)
其实,我们发现一对一和一对多查询基本上是差不多的。
3.多对多
正向查询:查询作者名为gong的所有book
author_obj=models.Author.objects.get(name='gong')
print(author_obj.book.all())
反向查询:查询书为"网络基础"的所有作者
book_obj=models.Book.objects.get(title='网络基础')
print(book_obj.author_set.all())
总而言之,正向查询直接顺序获取,反向查询用 类名(全部小写)_set.all() 来获取。
弄了一天,总算初步理解了咋弄的。!!