我有两个模型:Like 和 Object。我如何使用以下模型检索喜欢该对象的相应人员集:
class Object(models.Model):
...
class Like(models.Model):
user = models.ForeignKey(User)
object = models.ForeignKey(Object)
friends = [...some list of ids...]
我考虑过这两种方法:使用 Object 或使用 Like,但都不起作用。例如:
Object.objects.prefetch_related('like_set').filter(like__user__in=friends)
这会为每个对象获取相应的点赞集,但每个 like_set 将包含所有点赞,而不是我 friend 的点赞。
另一种方式是通过点赞:
Like.objects.select_related('object').filter(user__in=friends) \
.order_by('-user_id').distinct('object')
但我相信这种方式只会让我喜欢每个对象。那么有没有什么办法可以让我的 friend 对每个对象都点赞呢?
编辑:为了澄清,我需要与每个对象对象相对应的用户对象列表,因为我希望能够打印出它们的名称。我还想尽量减少查询数量,并且愿意使用原始 SQL。
请您参考如下方法:
这应该可以满足您的需求,但您确实需要一个 ManyToMany在你的 Friends 模型上添加到 Objects 并将其命名为 likes。
from collections import Counter
likes_of_friends = Like.objects.filter(friends__in=friend_list)
objects_of_likes = likes_of_friends.values_list('object__pk',flat=True)
number_of_likes = dict(Counter(list(objects_of_likes)))
for key,val in number_of_likes.iteritems():
print 'My friends like %s object %d times' % (Object.objects.get(pk=key),val)
