2

我有两个模型: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 将包含所有喜欢而不是我朋友的喜欢。

另一种方法是通过Like:

Like.objects.select_related('object').filter(user__in=friends) \
                                     .order_by('-user_id').distinct('object')

但我相信这种方式只会让我每个对象都喜欢一个。那么有没有办法让我的朋友对每个对象都喜欢呢?

编辑:为了澄清,我需要与每个 Object 对象对应的 User 对象列表,因为我希望能够打印出它们的名称。我还想尽量减少查询的数量,并愿意使用原始 SQL。

4

2 回答 2

0

更新

objects = {}
for obj in Like.objects.filter(user__in=friends):
    objects.setdefault(obj.object, set()).add(obj.user)

# objects is a dict w/ object as key and the set of friends who like the object as the value

为了得到喜欢的朋友object

User.objects.filter(like__object=object, pk__in=friends) # .distinct() depends on your schema

获得你的朋友和对象之间的所有相似关系

Like.objects.filter(user__in=friends).order_by('user') # .distinct() depends on your schema

为朋友喜欢的每个对象获取所有朋友

for obj in Object.objects.filter(like__user__in=friends).distinct():
    User.objects.filter(like__object=object).distinct()
于 2012-04-21T12:11:18.403 回答
0

这应该可以满足您的需求,但是您确实需要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)
于 2012-04-21T06:54:25.000 回答