2011-07-19 4 views
3

私はDjangoを使ってソーシャルネットワーキングアプリケーションを作成しており、Facebookの「Mutual Friends」コンセプトに似た機能を実装する必要があります。Django:交差オブジェクト(相互の友人)の数に応じて商品を注文する

class Friend(models.Model): 
    user = models.ForeignKey(User) 
    guid = models.BigIntegerField() 
    name = models.TextField() 

    class Meta: 
     unique_together = ['user', 'facebook_id'] 

それは私のサイトのユーザー、および彼の友人の一人との関係を表している:私はこのような単純なモデルを持っています。 (友人も、必ずしもユーザーではありません)2人のユーザー間で共通の友人の数は、他の言葉で、彼らの友人リストの交点として計算することができ、

users = User.objects.all() 
friends = Friend.objects.filter(user=request.user) 
friend_ids = [f.guid for f in friends] 
for user in users: 
    user.mutual = Friend.objects.filter(user=user, guid__in=friend_ids).count() 

(上記を行うための、より効率的な方法は、獲得しますボーナスポイント)。

私の主な質問は、ユーザー間で相互の友人の数を計算したところです今現在のユーザーのお友達の数に応じてusers質問セットを注文することはできますか?この場合、注釈や追加フィールドとしてカウントを保存することはできません。特定のユーザーとその全友人の特定のサブセットのみに依存するためです。 annotateまたはextraメソッドを巧妙な方法で使用できますか?または、raw SQLクエリは唯一の方法ですか?もしそうなら、どうですか?

を要約すると:

ユーザごとに共通の友人の数を計算する問題ではありません。各ユーザーの情報があれば、その番号に従ってQuerySetを注文するにはどうすればよいですか?

答えて

2

ない、これはこれは、彼らが共有する数で注文した彼らは、ユーザーと共有する友人の量とユーザ名のリストを、返しますまさにあなたが探しているけど...

# get current users friends (assuming guid is unique for a friend?) 
user_friend_guids = Friend.objects.values_list('guid', flat=True).filter(user=user) 

# get Friend objects where user not current user, is in user_friend_list, group and count by user 
mutual_friends = Friend.objects.values('user__username') \ 
           .filter(guid__in=user_friend_guids).exclude(user=user) \ 
           .annotate(number_mutual_friends=Count('user')) \ 
           .order_by('-number_mutual_friends') 

であれば確認してください。その後、テンプレート内

:私はかなり私が探しているではない何を恐れている

{% for mutual_friend in mutual_friends %} 
    {{mutual_friend.user__username}} - {{mutual_friends.number_mutual_friends}} 
{% endfor %} 
+0

:私は共通の友人のその数に応じてUser'sオブジェクト 'のリストを注文していますよ、 'Friend'sのオブジェクトではありません。小さな違いですが、それは私にトラブルを与えているユーザーの注文です。明確にするために、 'User'オブジェクトは通常のDjangoバックエンド' User'オブジェクトですが、 'Friend'は上記のように定義されていて、実際のユーザは表しません。 –

+0

ok、明確にするために上記はFriendオブジェクトを返さないでしょう。 james、 "number_mutual_friends":10}、{"user__username":herman、 "number_mutual_friends":6}の形式でリストを返すので、ユーザー名のリスト(またはフィールドあなたはユーザーオブジェクトを言及していませんでした)。もしそれがユーザオブジェクトでなければならないと思うのですが(私は誰か他の人が答えているかもしれません)、生のSQLを使ってやる必要があるか、またはpython eghttp://stackoverflow.com/questions/981375/using -a-django-custom-model-method-property-in-order-by – JamesO

+0

よろしくお願いします。残念ながら、10000人以上のユーザーがいる可能性があるため、Pythonで注文することはできません。しかし、はい、今考えてみましょう、あなたの方法は、それが必要なすべてかもしれないように見えます。私はもう少し周りに再生し、(うまくいけば解決策)戻ってきます。ありがとう! –

関連する問題