我有一个这样的模型:
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中执行此操作?
答案 0 :(得分:2)
如果您使用的是category.parent.parent
,则表示您将外键转发两次。因此,您可以使用select_related
。
Category.objects.filter(name__contains=something).select_related('parent__parent')
如果您向后关注外键(即获取类别的子项), prefetch_related
将非常有用。
如果要存储类别树,可能需要查看django-mptt。它可以使其他查询更有效。