我向数据库写入了3个查询,以获取不同的值。我需要将这些查询合并为一个查询。
# Counting Total Number of Plans by Day
Day.objects.annotate(num_of_plans=Count('plan')) \
.values('num_of_plans', 'date', 'id')
# Counting is_completed=True Plans by Day
Day.objects \
.filter(plan__is_completed=True) \
.annotate(num_of_completed_plans=Count('plan__is_completed')) \
.values('num_of_completed_plans', 'id', 'date')
# Counting status=deferred Plans by Day
Day.objects \
.filter(plan__status='deferred') \
.annotate(num_of_deferred_plans=Count('plan__is_completed')) \
.values('num_of_deferred_plans', 'id', 'date')
如您所见,上面有3个查询。我需要以某种方式优化此代码并借助一个查询获取值
楷模
class Day(models.Model):
date = models.DateField(default=datetime.date.today, unique=True)
class Plan(models.Model):
title = models.CharField(max_length=255)
status = models.CharField(max_length=255, choices=PLAN_STATUSES, null=True, default='upcoming')
is_completed = models.BooleanField(default=False, null=True)
day = models.ForeignKey(Day, CASCADE, null=True)
有什么方法可以优化3个查询并通过一个查询获取值?
从django-2.0开始,您可以在表达式中使用filter=…
参数[Django-doc]Count
。至于对的过滤Bool
,您可以只使用Sum
表达式[Django-doc]:
from django.db.models import Count, Q, Sum
Day.objects.annotate(
num_of_plans=Count('plan'),
num_of_completed_plans=Sum('plan__is_completed'),
num_of_deferred_plans=Count('plan', filter=Q(plan__status='deferred'))
)
通常,最好不要使用.values()
。但是要利用这些对象(具有额外的属性),因为这样您就可以完整地保留在模型上定义的逻辑。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句