5

次のフレンドシップモデルについて考えてみます。このモデルでは、作成されたすべてのフレンドシップに対して、フレンドリクエストを送信したユーザーとフレンドリクエストを受信したユーザーがいます。

from django.contrib.auth.models import User

class Friendship(models.Model):
    sender = models.ForeignKey(User)
    receiver = models.ForeignKey(User)

たとえば、user123とフレンドシップにあるユーザーのすべてのユーザー名を取得するクエリを作成するにはどうすればよいですか?

user123は、彼がいる友情の送信者または受信者である可能性があることに注意してください。

また、Userオブジェクト全体ではなく、User.username値のみを返すようにします。


これまでのところ、私はこの不格好な半分/解決策を持っています( user123の受信友達とuser123の送信友達list()の両方を追加して、最終的にすべての友達のリストを作成できるようにするために使用しています)。問題は、すべてのUserオブジェクトを取得していて、ユーザー名のみが必要なことです...これを行うためのより良い方法が必要です。

friends_a = list(Friendship.objects.filter(sender=user123).values('receiver'))
friends_b = list(Friendship.objects.filter(receiver=user123).values('sender'))
friends_a = [] if not friends_a else friends_a[0].values()
friends_b = [] if not friends_b else friends_b[0].values()
all_friends = friends_a + friends_b
4

1 に答える 1

5

Q複雑なルックアップ用のオブジェクト。

うわー、これは驚くべきことに、実際には2つの異なる論理クエリがあるため、必要な結果セットを取得するためのマインドベンダーです。最も簡単な方法は...Pythonでそれを綴ることです。

user = User.objects.get(username='user123')
friendships = Friendship.objects.filter(Q(receiver=user) | Q(sender=user))

usernames = []

for friendship in friendships:
    if friendship.receiver == user:
        usernames.append(friendship.receiver.username)
    else:
        usernames.append(friendship.sender.username)
于 2013-01-13T22:29:06.990 に答える