📅  最后修改于: 2023-12-03 14:50:54.351000             🧑  作者: Mango
在 Django 中,将其他模型的外键设置为当前模型的一部分很常见。在这种情况下,您可能想要选择当前模型的所有子对象,然后对它们进行操作。在本文中,我们将学习如何在 Django 中选择具有 ForeignKey 的对象的子对象。
假设我们有一个名为 Book
的模型,它具有一个 ForeignKey 字段,该字段指向另一个名为 Author
的模型。我们将学习如何选择 AuthorBook
关系表中具有特定 Author
的所有书籍。
from myapp.models import Book, AuthorBook
# 选择所有的AuthorBook对象匹配,然后取到Book对象,最后取到相应的查询集.
books = Book.objects.filter(authors__name='John').all()
这里我们使用了 filter()
函数来选择所有满足条件的 AuthorBook
对象,然后使用双下划线符号来访问 Author
模型中的属性,该属性指向 Book
模型。最后,我们使用 all()
函数检索所有匹配的子对象。
如果我们想在返回的结果中仅包含与 Author
模型匹配的 Book
对象,则可以使用 select_related()
函数进行优化:
from myapp.models import Book, AuthorBook
books = Book.objects.filter(authors__name='John').select_related('authors').all()
在这里,我们使用了 select_related()
函数,该函数将查询结果与 Author
模型提前加载到内存中,以便更快地访问相关数据。
上面的方法需要使用 __ 符号来取得关联对象,但是如果你不想要这么做,可以使用子查询。
from myapp.models import Book, AuthorBook
books = Book.objects.filter(id__in=AuthorBook.objects.filter(author__name='John').values_list('book_id', flat=True)).all()
这里,我们首先使用 filter()
函数选择所有满足条件的 AuthorBook
对象,然后使用 values_list()
函数仅检索 book_id
列。最后,我们使用 id__in
运算符选择具有这些 id
的 Book
对象。
在 Django 中选择具有 ForeignKey 的对象的子对象非常简单。您可以使用 filter()
函数并使用 __ 符号来选择它们,还可以使用子查询。注意,如果您需要对结果进行优化,则可以使用 select_related()
函数。