Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django ORM三级嵌套价格总和_Django_Django Orm_Django Annotate - Fatal编程技术网

Django ORM三级嵌套价格总和

Django ORM三级嵌套价格总和,django,django-orm,django-annotate,Django,Django Orm,Django Annotate,我有这些模型和经理: class ItemManager(models.Manager): use_for_related_fields = True def get_queryset(self): qs = super().get_queryset() return qs.annotate(total_price=ExpressionWrapper( F('gross_price') * F('qty'), outpu

我有这些模型和经理:


class ItemManager(models.Manager):
    use_for_related_fields = True

    def get_queryset(self):
        qs = super().get_queryset()
        return qs.annotate(total_price=ExpressionWrapper(
            F('gross_price') * F('qty'), output_field=models.DecimalField())
        )


class OrderManager(models.Manager):
    use_for_related_fields = True

    def get_queryset(self):
        qs = super().get_queryset()
        return qs.annotate(total_price=Sum(items__total_price))  # this doesnt work



class Order(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    name = models.CharField(max_length='50')


class Item(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    price = models.DecimalField(max_digits=14, decimal_places=2)
    qty = models.IntegerField()
    order = models.ForeignKey(Order, related_name='items', on_delete=models.CASCADE)

    objects = ItemManager()

我想得到订单的总价,如下所示:

for sale in Order.objects.all():
    print(sale.total_price)
错误:

django.core.exceptions.FieldError: Unsupported lookup 'total_price' for UUIDField or join on the field not permitted.
我可以得到每个项目的
total_price
,我想用这个
total_price
来得到所有项目的总和。
我需要这样做,因为我将在具有多个订单作为子元素的模型中使用该销售总价。

如果查询相关模型,这些相关模型不会“通过”
.objects
管理器。您可以覆盖
\u base\u manager
等,但我强烈建议不要这样做

您最好在
OrderManager
本身中完成这项工作:

class OrderManager(models.Manager):
    use_for_related_fields = True

    def get_queryset(self):
        return super().get_queryset().annotate(
            total_price=Sum(F('items__price') * F('items__qty'))
        )
class OrderManager(models.Manager):
将\u用于与\u相关的\u字段=True
def get_queryset(自我):
返回super().get_queryset().annotate(
总价=总和(F(“项目价格”)*F(“项目数量”)

)
我知道这个解决方案,但我需要这样做,因为我将使用它来获得订阅中所有订单的总和,并且订阅有多个订单。所以我真的需要这样做。@MirzaDelic:嗯,作为帮助,你可以覆盖
项的
\u base\u管理器
管理器。但我个人会反对“蟒蛇之禅”。显式优于隐式是规则#2:)