为了账号安全,请及时绑定邮箱和手机立即绑定

Django querysets.使用一个查询批注不同的字段

Django querysets.使用一个查询批注不同的字段

慕慕森 2022-08-16 10:09:47
我向数据库编写了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个查询并使用一个查询获取值?
查看完整描述

1 回答

?
慕田峪9158850

TA贡献1794条经验 获得超7个赞

因为django-2.0,则可以在表达式中使用 filter=... 参数 [Django-doc]。至于对 a 的过滤,你可以只使用 Sum 表达式 [Django-doc]CountBool

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()




查看完整回答
反对 回复 2022-08-16
  • 1 回答
  • 0 关注
  • 82 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信