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