gpt4 book ai didi

python - 仅对一个注释列应用过滤器而不影响其他注释列?

转载 作者:行者123 更新时间:2023-12-04 09:35:43 24 4
gpt4 key购买 nike

我按一个值分组,然后是一个字段的总和,但现在我只想在 annotate 中的列中发生总和大于或等于 1 !
我的模型.py

class MyModel(models.Model):
name = models.ForeignKey(Product, on_delete=models.CASCADE)
order = models.IntegerField()
price = models.IntegerField()

class Prodcut(models.Model):
name = models.CharField(max_lenth=20)
cost = models.IntegerField()
price = models.IntegerField()
这是我的查询
MyModel.objects.values('name__name').annotate(
income=(
Sum(((F('price')*F('order')) - (
(F('name__price')+F('name__cost'))*F('order'))
),output_field=IntegerField())),quantity=(
Sum(F('order'))
))
有时会发生收入小于 0(负值),我不想对收入小于 0 的那些产品求和,我想在 annotate 中使用类似的东西或 Sum income__gte=1 !? ,
我还有一些
我不想使用的字段 .filter)annotate如果新收入大于或等于 1,是否只能添加到收入列?

最佳答案

您可以添加第二个注释来过滤第一个注释。在这种情况下,您可以使用 Greatest 如果实际收入为负则返回 0

from django.db.models.functions import Greatest
MyModel.objects.annotate(
actual_income=F('price') * F('order') - (F('name__price') + F('name__cost')) * F('order'),
).annotate(
income=Greatest(F('actual_income'), 0)
)
我经常发现使用多个命名注释会让事情变得更清晰
MyModel.objects.annotate(
total_charged=F('price') * F('order'),
total_paid=(F('name__price') + F('name__cost')) * F('order')
).annotate(
revenue=F('total_charged') - F('total_paid')
).annotate(
income=Greatest(F('revenue'), 0)
)

关于python - 仅对一个注释列应用过滤器而不影响其他注释列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62601587/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com