我正在尝试预取相关对象以优化性能。我尝试预取的代码是这样的;
class Product(models.Model):
...
def get_attribute_values(self):
# ToDo: Implement this prefetch.
if hasattr(self, "_prefetched_attribute_values"):
return self._prefetched_attribute_values
if not self.pk:
return self.attribute_values.model.objects.none()
attribute_values = self.attribute_values.all()
if self.is_child:
parent_attribute_values = self.parent.attribute_values.exclude(
attribute__code__in=attribute_values.values("attribute__code")
)
return attribute_values | parent_attribute_values
return attribute_values
其作用如下;
attribute_values
,attribute_values
是相关模型ProductAttributeValue
attribute_values
,但排除 attribute_values
和子项中已存在的 attribute__codes
结果将它们结合在一起。attribute_values
这适用于非子场景,但不幸的是,有很多子产品,因此性能不是很好。
所以理想情况下,我可以将组合属性预取到“_prefetched_attribute_values”,尽管我也可以进行两次预取;
对于产品本身
Prefetch(
"attribute_values",
queryset=ProductAttributeValueModel.objects.select_related(
"attribute", "value_option"
)
),