django - 来自 3 层嵌套的 Django ORM 总和价格
问题描述
我有这些模型和经理:
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
管理器。您可以覆盖._base_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'))
)
推荐阅读
- c++ - 使用 setlocale 的 C++ 土耳其语字符串问题
- android - Firebase:程序类型已存在:com.google.android.gms.ads.identifier.AdvertisingIdClient$zza
- android - How to set the background image for textview with Glide?
- excel - 以数字为文本的高级过滤器
- sql - 表未加入的 SQL Oracle 加入问题
- c# - 工厂方法设计模式似乎只是一个 If/Else 或 Switch 语句。我错过了什么?
- android - 如何在 AWS 中创建符合 Hipaa 标准的 Android 应用程序开发?
- react-native - React Native - 带有hitSlop的内联可按下组件与文本内联
- javascript - 不使用 jQuery 将 JS 文件加载到 DOM 中
- iframe - 使用应用程序脚本在 IFRAME 中提供的电子表格中打开一个对话框会生成“docs.google.com 拒绝连接”。