Django在Annotation中过滤查询集

时间:2015-06-28 09:54:35

标签: django python-2.7 django-models django-orm

我有以下models

1. City
2. Picture
3. Video

我想使用Picture为每个城市获取Videoannotate的计数。我面临的唯一问题是我不知道如何过滤带注释的对象。

cities = City.objects.filter(pro=pro).annotate(
        img_count=Count('city_pictures', distinct=True),
        video_count=Count('city_videos', distinct=True)).order_by('-img_count').values('name', 'img_count', 'video_count')

问题

目前,我无法过滤verified

的图片

补丁解决方案

cities = City.objects.default().filter(pro=pro)

for city in cities:
    city.image_count = Picture.objects.filter(verified=True).count()
    city.video_count = Vidoe.objects.filter(verified=True).count()

但这会对数据库进行额外的查询。我需要通过这种方式来进行最小的数据库查询并实现我正在寻找的目标。

感谢。

1 个答案:

答案 0 :(得分:0)

你应该在这里使用aggregate_if包(link)。

它包含CountMinMax等具有only参数的实现,您可以使用这些参数传递所需的Q个对象。

您的最终代码应如下所示:

from aggregate_if import Count  # don't forget to import it from here!

cities = City.objects.filter(pro=pro).annotate(
        img_count=Count('city_pictures', distinct=True, only=Q(city_pictures__verified=True)),
        video_count=Count('city_videos', distinct=True, only=Q(city_videos__verified=True))).order_by('-img_count').values('name', 'img_count', 'video_count')