📜  在 Django 中选择具有 ForeignKey 的对象的子对象? - Python (1)

📅  最后修改于: 2023-12-03 14:50:54.351000             🧑  作者: Mango

在 Django 中选择具有 ForeignKey 的对象的子对象

在 Django 中,将其他模型的外键设置为当前模型的一部分很常见。在这种情况下,您可能想要选择当前模型的所有子对象,然后对它们进行操作。在本文中,我们将学习如何在 Django 中选择具有 ForeignKey 的对象的子对象。

查询具有 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 模型提前加载到内存中,以便更快地访问相关数据。

使用子查询选择具有 ForeignKey 的对象的子对象

上面的方法需要使用 __ 符号来取得关联对象,但是如果你不想要这么做,可以使用子查询。

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 运算符选择具有这些 idBook 对象。

结论

在 Django 中选择具有 ForeignKey 的对象的子对象非常简单。您可以使用 filter() 函数并使用 __ 符号来选择它们,还可以使用子查询。注意,如果您需要对结果进行优化,则可以使用 select_related() 函数。