私は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
を注文するにはどうすればよいですか?
:私は共通の友人のその数に応じてUser'sオブジェクト 'のリストを注文していますよ、 'Friend'sのオブジェクトではありません。小さな違いですが、それは私にトラブルを与えているユーザーの注文です。明確にするために、 'User'オブジェクトは通常のDjangoバックエンド' User'オブジェクトですが、 'Friend'は上記のように定義されていて、実際のユーザは表しません。 –
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
よろしくお願いします。残念ながら、10000人以上のユーザーがいる可能性があるため、Pythonで注文することはできません。しかし、はい、今考えてみましょう、あなたの方法は、それが必要なすべてかもしれないように見えます。私はもう少し周りに再生し、(うまくいけば解決策)戻ってきます。ありがとう! –