django select_related vs prefetch_related in tree like table

时间:2018-04-16 09:15:44

标签: python django django-models parent hierarchy

我有一个这样的模型:

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。 如何在django ORM中执行此操作?

1 个答案:

答案 0 :(得分:2)

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

Category.objects.filter(name__contains=something).select_related('parent__parent')
如果您向后关注外键(即获取类别的子项),

prefetch_related将非常有用。

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