仅在一个注释列上应用过滤器而不影响其他注释列?

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 的产品求和,我想在 annotateSum 中使用类似的东西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)
)