Django查询集。使用一个查询注释不同的字段

达斯汀·森

我向数据库写入了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个查询并通过一个查询获取值?

威廉·范昂塞姆

,您可以表达式中使用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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

Related 相关文章

热门标签

归档