【发布时间】:2021-09-17 19:10:21
【问题描述】:
我正在尝试从子查询中的另一个模型返回字段的总和。
我的主要查询集返回公司类型的所有用户。我必须通过从 CreditOrder 中获取数据并汇总 credit_used 字段来返回使用的积分总数。
我正在使用来自 django-modelcluster 的 ClusterableModel 和 ParentalKey
我的CreditOrder 模特
class CreditOrder(ClusterableModel):
credit = ParentalKey(
Credit, on_delete=models.CASCADE, related_name="credit_order"
)
order = ParentalKey(Order, on_delete=models.CASCADE, related_name="credit_order")
credit_used = models.DecimalField(
max_digits=12, decimal_places=2, null=True, blank=True
)
我的User 模特
class User(AbstractUser, ClusterableModel):
username = models.CharField(max_length=40, null=True, blank=True)
user_type = models.CharField(max_length=20, choices=TIPO_UTENTE, default="dipendente")
我的查询集使用类模型 User
def get_queryset(self, request):
qs = super().get_queryset(request)
qs = qs.filter(user_type='company')
credits_used_subquery = Subquery(CreditOrder.objects.filter(credit__font__company__id=OuterRef('id')).order_by()
.values('credit_used').annotate(credit_used_sum=Sum('credit_used'))
.values('credit_used_sum'), output_field=DecimalField())
qs = qs.annotate(
_credits_used_sum=credits_used_subquery
)
return qs
但是这个错误正在返回我:
django.db.utils.ProgrammingError: more than one row returned by a subquery used as an expression
【问题讨论】:
-
欢迎来到 Stack Overflow。请参阅如何写一个minimal reproducible example。在您的问题中,特别是很少有事情令人困惑什么是
ClusterableModel,ParentalKey??你的get_queryset方法处理的是什么模型类?问题很可能是因为错误表明您的子查询返回多行。您可以通过将其切片[:1]来限制它,这可能会有所帮助,但取决于您想要的结果可能会给出错误的结果。 -
您好阿卜杜勒,感谢您的反馈。我用更多细节编辑了这篇文章。不幸的是我不能分裂,所有的物体和它们的总和都为我服务。我也尝试执行此子查询:CreditOrder.objects.filter(credit__font__company__id =OuterRef('id')).aggregate(credit_used_sum=Sum('credit_used')),但我收到此错误:此查询集包含对外部的引用查询并且只能在子查询中使用。
标签: python sql django django-queryset django-database