预取执行 Union 的复杂查询

问题描述 投票:0回答:1

我正在尝试预取相关对象以优化性能。我尝试预取的代码是这样的;

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

其作用如下;

  1. 获取自身所有
    attribute_values
    attribute_values
    是相关模型
    ProductAttributeValue
  2. 如果是子项,还获取父项
    attribute_values
    ,但排除
    attribute_values
    和子项中已存在的
    attribute__codes
    结果
    将它们结合在一起。
  3. 目前,我有这个预取;

attribute_values

这适用于非子场景,但不幸的是,有很多子产品,因此性能不是很好。

所以理想情况下,我可以将组合属性预取到“_prefetched_attribute_values”,尽管我也可以进行两次预取;

对于产品本身
  1. 对于父级,但仍需要排除子级本身具有的属性
  2. 我尝试过使用 Subquery 和 OuterRef 来完成此操作,但还没有成功。

django orm prefetch
1个回答
0
投票

Prefetch( "attribute_values", queryset=ProductAttributeValueModel.objects.select_related( "attribute", "value_option" ) ),

	
© www.soinside.com 2019 - 2024. All rights reserved.