python 2.7-Annotation中的Django过滤器查询集



我有以下models

1. City
2. Picture
3. Video

我想得到每个使用annotate的城市的PictureVideo的计数。我面临的唯一问题是,我不知道如何过滤注释对象。

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

但这将对数据库进行额外的查询。我需要一种方法,我可以进行最低限度的数据库查询,并实现我想要的。

谢谢。

您应该在此处使用aggregate_if包(链接)。

它包含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')

最新更新