在我的Django应用程序中,用户上传照片和其他人投票或者投票。
我有一个包含100个用户ID的列表,这些用户ID具有最佳的聚合照片分数。对于此列表中的每个ID,我想查找ID已发布的照片总数。我目前正在for循环中这样做,这让我做100个DB调用:
for user in context["object_list"]:
count = Photo.objects.filter(owner_id=user.id).count()
这是非常低效的。我如何在一个电话中完成这项工作?
其次,我想将原始的用户ID列表转换为元组列表,其中每个用户ID与该id发布的照片数量相加。例如。 [(1,20),(2,39),(3,45)]等。请注意,我似乎无法绕过这个。
我的照片模特是:
class Photo(models.Model):
owner = models.ForeignKey(User)
image_file = models.ImageField(upload_to=upload_photo_to_location, storage=OverwriteStorage())
upload_time = models.DateTimeField(auto_now_add=True, db_index=True)
答案 0 :(得分:1)
您可以使用User
<{1}} <{1}}代替annotate
模型(代码更直观)
in_bulk
然后,您可以构建列表:
from django.db.models import Count
user_ids = [user.id for user in context["object_list"]]:
users = User.objects.annotate(photo_count=Count('photo', distinct=True)).in_bulk(user_ids)
答案 1 :(得分:0)
您可以使用annotate
1> values_list()
来执行此操作
正如您所期望的那样,输出是带有user_id的元组列表及其上传的照片数
from django.db.models import Count
user_ids = [user.id for user in context["object_list"]]
user_photos = Photo.objects.filter(owner_id__in=user_ids).values('owner').annotate(Count('owner')).values_list('owner', 'owner__count')
# user_photos = [(1, 31), (2, 41), (3, 12)......]