仅在一个注释列上应用过滤器而不影响其他注释列?
apply filter only on one annotate columns without effect on other annotate columns?
我按一个值分组,然后按一个字段的总和分组,但现在我只想在 annotate
内的列大于或等于 1 时才发生求和!
我的models.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
!? ,
我还有一些
我不想在 )annotate
末尾使用 .filter
的字段
是否可以只在新收入大于等于1时才添加到收入栏?
您可以添加第二个注释来过滤第一个注释。这种情况下可以用Greatest
到return0如果实际收入为负
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)
)
我按一个值分组,然后按一个字段的总和分组,但现在我只想在 annotate
内的列大于或等于 1 时才发生求和!
我的models.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
!? ,
我还有一些
我不想在 )annotate
.filter
的字段
是否可以只在新收入大于等于1时才添加到收入栏?
您可以添加第二个注释来过滤第一个注释。这种情况下可以用Greatest
到return0如果实际收入为负
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)
)