如何计算一行中非零字段的数量并使用它在 Django 中进行查询

How to calculate the number of non-zero fields in a row and using that make a query in Django

我的模型

from django.db import models

class Books(models.Model):
    field_1 = models.IntegerField(default=0)
    field_2 = models.IntegerField(default=0)
    ..........................
    field_6 = models.IntegerField(default=0)
    

现在我想查询计算 Books 的数量,其中正好有 3 个字段不为零。

你可以这样试试:

Books.objects.annotate(
    v1 = Case(
        When(field_1=0,then=1),
        default=0,
        output_field=IntegerField()
    ),
    v2 = Case(
        When(field_2=0,then=1),
        default=0,
        output_field=IntegerField()
    ),
    v3 = Case(
        When(field_3=0,then=1),
        default=0,
        output_field=IntegerField()
    )
    # ....
).annotate(
      non_zero_sum=F('v1')+F('v2')+F('v3')+F('v4')+F('v5')+F('v6')
).filter(non_zero_sum=3)

但是恕我直言,模型设计不正确。如果你有多次相同类型的字段,并且可以是非零的,最好为此创建外键关系:

class SomeField(models.Model):
    value = models.IntegerField()
    book = models.ForeignKey(Book, related_name='fields')

那么你可以这样尝试:

from django.db.models import Count

Book.objects.annotate(c = Count('fields')).filter(c__gte=3)