如何让所有喜欢对象的朋友获得对象列表?

时间:2012-04-21 03:32:37

标签: python sql django database-design

我有两个模型: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。

2 个答案:

答案 0 :(得分:0)

这应该可以做你想要的,但是你的朋友模型对象确实需要ManyToMany,并称之为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)

答案 1 :(得分: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()