我有以下models
。
1. City
2. Picture
3. Video
我想使用Picture
为每个城市获取Video
和annotate
的计数。我面临的唯一问题是我不知道如何过滤带注释的对象。
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()
但这会对数据库进行额外的查询。我需要通过这种方式来进行最小的数据库查询并实现我正在寻找的目标。
感谢。
答案 0 :(得分:0)
你应该在这里使用aggregate_if包(link)。
它包含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')