程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了如何在Django中过滤用于计数注释的对象?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决如何在Django中过滤用于计数注释的对象??

开发过程中遇到如何在Django中过滤用于计数注释的对象?的问题如何解决?下面主要结合日常开发的经验,给出你关于如何在Django中过滤用于计数注释的对象?的解决方法建议,希望对你解决如何在Django中过滤用于计数注释的对象?有所启发或帮助;

Django 2.0中的条件聚合使你可以进一步减少过去的流量。这也将使用Postgres的filter逻辑,该逻辑比求和的情况要快一些(我见过像20-30%这样的数字被打乱)。

无论如何,就你的情况而言,我们正在研究简单的东西:

from django.db.models import Q, Count
events = Event.objects.annotate(
    paID_participants=Count('participants', filter=Q(participants__is_paID=True))
)

在文档中还有一个单独的部分,关于注释过滤。它和条件聚合是一样的东西,但是更像上面的例子。无论哪种方式,这都比我之前做的粗糙子查询要健康得多。

刚刚发现Django 1.8具有新的条件表达式功能,所以现在我们可以这样做:

events = Event.objects.all().annotate(paID_participants=models.Sum(
    models.Case(
        models.When(participant__is_paID=True, then=1),
        default=0, output_fIEld=models.IntegerFIEld()
    )))

解决方法

考虑简单的Django模型EventParticipant

class Event(models.Model):
    title = models.CharField(max_length=100)

class Participant(models.Model):
    event = models.ForeignKey(Event,db_index=True)
    is_paid = models.BooleanField(default=False,db_index=True)

使用参与者总数来注释事件查询很容易:

events = Event.objects.all().annotate(participants=models.Count('participant'))

如何用筛选的参与者计数进行注释is_paid=True

我需要查询所有事件,而与参与者人数无关,例如,我不需要按带注释的结果进行过滤。如果有0参与者,那没关系,我只需要带有0注释的值即可。

文档中的示例在这里不起作用,因为它从查询中排除了对象,而不是使用注释了对象0。

更新。Django 1.8具有新的条件表达式功能,因此我们现在可以像这样:

events = Event.objects.all().annotate(paid_participants=models.Sum(
    models.Case(
        models.When(participant__is_paid=True,then=1),default=0,output_field=models.IntegerField()
    )))

大佬总结

以上是大佬教程为你收集整理的如何在Django中过滤用于计数注释的对象?全部内容,希望文章能够帮你解决如何在Django中过滤用于计数注释的对象?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: