Django应用程序中的棘手列表处理

时间:2016-05-25 13:43:23

标签: python django django-models django-views

在我的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)

2 个答案:

答案 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 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)......]