Django ORM在查询某些计算时出现字段错误。

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

这是我的购买模式。

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美元。

我想实现上面这个计算,但是它给我发了一个错误。

谁能帮我实现这个目标?

django django-models django-orm
1个回答
1
投票
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 因此,计算发生在相同的数据类型上。在消耗_entry_for的情况下,不需要传递output_field,查询将不需要它,因为该字段已经是一个FloatField。

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