如何计算一行中非零字段的数量并使用它在 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)
我的模型
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)