我有以下models
。
1. City
2. Picture
3. Video
我想得到每个使用annotate
的城市的Picture
和Video
的计数。我面临的唯一问题是,我不知道如何过滤注释对象。
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包(链接)。
它包含Count
、Min
、Max
等带有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')