Django ORM FieldError 在一些计算的查询中
Django ORM FieldError in query of some calculation
这是我要购买的型号:
class Purchase(models.Model):
amount = models.DecimalField(
max_digits=6,
decimal_places=2,
default=0.00
)
entry_by = models.ForeignKey(
User,
on_delete=models.SET_NULL,
related_name='ledger_entry_by',
)
这是我的消费模型:
class Consume(models.Model):
amount = models.FloatField(default=1)
consumed_by = models.ForeignKey(
User,
on_delete=models.SET_NULL,
related_name='consume_entry_for',
)
我正在尝试找出用户消费多于购买的数量以及消费少于购买的数量
这是我对此的查询:
purchase_vs_consume = User.objects.annotate(
purchase_vs_consume=Coalesce(Sum('ledger_entry_for__amount'), Value(0)) - Coalesce(Sum('consume_entry_for__amount'), Value(0))
)
它抛出以下错误:
Expression contains mixed types: DecimalField, FloatField. You must set output_field
后来我的查询是:
purchase_vs_consume = User.objects.annotate(
purchase_vs_consume=Coalesce(Sum('ledger_entry_for__amount'), Value(0)) - Coalesce(Sum('consume_entry_for__amount'), Value(0)), output_field=FloatField()
)
它抛出以下错误:
QuerySet.annotate() received non-expression(s): <django.db.models.fields.FloatField>.
我不明白这有什么问题。
我要:
例如,某用户购买了500美元,他消费了550美元,也就是说,他需要再支付50美元
另一个用户购买了440美元,他消费了400美元,也就是说,你将获得40美元的退款。
另一个用户示例可以是:用户没有购买任何东西,但他消费了 300 美元,所以他需要支付 300 美元
我正在努力实现上述计算,但它引发了一个错误。
谁能帮我实现这个目标?
User.objects.annotate(purchase_vs_consume=Coalesce(Sum('ledger_entry_by__amount'), Value(0), output_field=FloatField()) - Coalesce(Sum('consume_entry_for__amount'), Value(0), output_field=FloatField())).values('purchase_vs_consume')
请更新您的查询。您在每个模型中使用两种不同类型的字段并进行计算。因此,当您在内部进行聚合时,您必须传递 output_field
以便对相同的数据类型进行计算。
在 consume_entry_for 的情况下不需要传递 output_field,查询将在没有它的情况下工作,因为该字段已经是 FloatField。
这是我要购买的型号:
class Purchase(models.Model):
amount = models.DecimalField(
max_digits=6,
decimal_places=2,
default=0.00
)
entry_by = models.ForeignKey(
User,
on_delete=models.SET_NULL,
related_name='ledger_entry_by',
)
这是我的消费模型:
class Consume(models.Model):
amount = models.FloatField(default=1)
consumed_by = models.ForeignKey(
User,
on_delete=models.SET_NULL,
related_name='consume_entry_for',
)
我正在尝试找出用户消费多于购买的数量以及消费少于购买的数量
这是我对此的查询:
purchase_vs_consume = User.objects.annotate(
purchase_vs_consume=Coalesce(Sum('ledger_entry_for__amount'), Value(0)) - Coalesce(Sum('consume_entry_for__amount'), Value(0))
)
它抛出以下错误:
Expression contains mixed types: DecimalField, FloatField. You must set output_field
后来我的查询是:
purchase_vs_consume = User.objects.annotate(
purchase_vs_consume=Coalesce(Sum('ledger_entry_for__amount'), Value(0)) - Coalesce(Sum('consume_entry_for__amount'), Value(0)), output_field=FloatField()
)
它抛出以下错误:
QuerySet.annotate() received non-expression(s): <django.db.models.fields.FloatField>.
我不明白这有什么问题。
我要:
例如,某用户购买了500美元,他消费了550美元,也就是说,他需要再支付50美元
另一个用户购买了440美元,他消费了400美元,也就是说,你将获得40美元的退款。
另一个用户示例可以是:用户没有购买任何东西,但他消费了 300 美元,所以他需要支付 300 美元
我正在努力实现上述计算,但它引发了一个错误。
谁能帮我实现这个目标?
User.objects.annotate(purchase_vs_consume=Coalesce(Sum('ledger_entry_by__amount'), Value(0), output_field=FloatField()) - Coalesce(Sum('consume_entry_for__amount'), Value(0), output_field=FloatField())).values('purchase_vs_consume')
请更新您的查询。您在每个模型中使用两种不同类型的字段并进行计算。因此,当您在内部进行聚合时,您必须传递 output_field
以便对相同的数据类型进行计算。
在 consume_entry_for 的情况下不需要传递 output_field,查询将在没有它的情况下工作,因为该字段已经是 FloatField。