Django:查询通过外键获取User.usernames

sga*_*a62 5 python django foreign-keys django-models

考虑以下友谊模型,对于每个友谊,有一个发送好友请求的用户和一个收到好友请求的用户:

from django.contrib.auth.models import User

class Friendship(models.Model):
    sender = models.ForeignKey(User)
    receiver = models.ForeignKey(User)
Run Code Online (Sandbox Code Playgroud)

我将如何构建一个查询,该查询将为我提供与例如user123在友谊中的用户的所有用户名

请记住,user123可能是他所处的任何友谊的发送者或接收者.

另外,我只想要返回User.username值,而不是整个User对象.


到目前为止,我有这个笨重的一半/解决方案(我正在使用,list()以便我可以添加user123的接收朋友和user123的发送朋友,最终生成所有朋友的列表).问题是,我得到了所有的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
Run Code Online (Sandbox Code Playgroud)

Yuj*_*ita 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)
Run Code Online (Sandbox Code Playgroud)