Django ORM group by calculation should return data if the foreign have no related data too
Django ORM group by calculation should return data if the foreign have no related data too
这是我的模型:
class Purchase(models.Model):
amount = models.DecimalField(
max_digits=6,
decimal_places=2,
default=0.00
)
entry_for = models.ForeignKey(
User,
on_delete=models.CASCADE,
related_name='ledger_entry_for',
)
例如,我有 400 多个用户,但只有 50 个用户多次购买
所以我想要每个用户的总购买量。
下面是我的查询:
purchase_user_wise = Purchase.objects.values(
'entry_for'
).annotate(
total_purchase=Sum('amount')
)
上面的查询很好用,我 return 每个用户的总金额,但问题是:它只计算 return 那些至少购买了一次或多次的用户。并且此查询未 returning 所有 400 个用户数据。
我想,如果任何用户没有任何购买条目,它应该 return 0
并且其余的计算应该这样进行。
任何人都可以帮助我,我该怎么做?
您应该以相反的方式进行:从 User
对象查询,然后 注释 用户:
from django.db.models import Sum
User.objects.annotate(
<b>total_purschase=Sum('ledger_entry_for__amount')</b>
)
这将 return 一个 User
个对象的查询集,这个 查询集中的每个 User
将有一个额外的属性 .total_purchase
.
如果用户没有购买,则总和将为 None
(NULL
)。您可以使用 Coalesce
expression [Django-doc] 代替 0
:
from django.db.models import Sum, <b>Value</b>
from django.db.models.functions import <b>Coalesce</b>
User.objects.annotate(
total_purschase=<b>Coalesce(</b>Sum('ledger_entry_for__amount')<b>, Value(0))</b>
)
这是我的模型:
class Purchase(models.Model):
amount = models.DecimalField(
max_digits=6,
decimal_places=2,
default=0.00
)
entry_for = models.ForeignKey(
User,
on_delete=models.CASCADE,
related_name='ledger_entry_for',
)
例如,我有 400 多个用户,但只有 50 个用户多次购买
所以我想要每个用户的总购买量。
下面是我的查询:
purchase_user_wise = Purchase.objects.values(
'entry_for'
).annotate(
total_purchase=Sum('amount')
)
上面的查询很好用,我 return 每个用户的总金额,但问题是:它只计算 return 那些至少购买了一次或多次的用户。并且此查询未 returning 所有 400 个用户数据。
我想,如果任何用户没有任何购买条目,它应该 return 0
并且其余的计算应该这样进行。
任何人都可以帮助我,我该怎么做?
您应该以相反的方式进行:从 User
对象查询,然后 注释 用户:
from django.db.models import Sum
User.objects.annotate(
<b>total_purschase=Sum('ledger_entry_for__amount')</b>
)
这将 return 一个 User
个对象的查询集,这个 查询集中的每个 User
将有一个额外的属性 .total_purchase
.
如果用户没有购买,则总和将为 None
(NULL
)。您可以使用 Coalesce
expression [Django-doc] 代替 0
:
from django.db.models import Sum, <b>Value</b>
from django.db.models.functions import <b>Coalesce</b>
User.objects.annotate(
total_purschase=<b>Coalesce(</b>Sum('ledger_entry_for__amount')<b>, Value(0))</b>
)