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。它可能会使其他查询更有效率。
我有这样一个模型:
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。它可能会使其他查询更有效率。