2

Like と Object の 2 つのモデルがあります。次のモデルを使用して、オブジェクトを気に入った対応する人々のセットを取得するにはどうすればよいですか?

class Object(models.Model):
    ...

class Like(models.Model):
    user = models.ForeignKey(User)
    object = models.ForeignKey(Object)

friends = [...some list of ids...]

私はこの 2 つの方法について考えました: Object を使用するか、Like を使用しますが、どちらも機能しません。例えば:

Object.objects.prefetch_related('like_set').filter(like__user__in=friends)

これにより、オブジェクトごとに対応するいいねのセットが取得されますが、各 like_set には、友達のいいねではなくすべてのいいねが含まれます。

もう 1 つの方法は、Like を通過することです。

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

しかし、この方法では、オブジェクトごとに1つのようなものしか得られないと思います。では、オブジェクトごとに友達のいいねをすべて取得する方法はありますか?

編集: 明確にするために、名前を出力できるようにするため、各オブジェクト オブジェクトに対応するユーザー オブジェクトのリストが必要です。また、クエリの数を最小限に抑えたいと考えており、未加工の SQL を使用することにオープンです。

4

2 に答える 2

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 に答える
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 に答える