django select_related vs prefetch_related 在像 table 这样的树中

django select_related vs prefetch_related in tree like table

我有这样一个模型:

class Category(models.Model):
   name = models.CharField(max_length=20)
   parent = models.ForeignKey('self', null=True)

我查询:

categories = Category.objects.filter(name__contains=something)

而且我想在类别之上预取 2 级父项。 所以我将能够迭代它们并做

category.parent.parent

无需额外查询。

在 SQL 中,这将等同于 LEFT JOIN 与相同的 table 两次。 如何在 Django ORM 中执行此操作?

如果您使用的是category.parent.parent,您将跟随外键转发两次。因此你可以使用 select_related.

Category.objects.filter(name__contains=something).select_related('parent__parent')

prefetch_related 如果您向后跟踪外键(即获取类别的子项),将会很有用。

如果要存储类别树,您可能需要查看 django-mptt。它可能会使其他查询更有效率。