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

时间:2013-01-13 22:24:33

标签: python django django-models foreign-keys

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

from django.contrib.auth.models import User

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

我如何构建一个查询,以便为我提供所有 用户名 的友情用户,例如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

1 个答案:

答案 0 :(得分:5)

Q Objects for complex lookups.

哇,这令人惊讶地得到了你想要的结果集,因为实际上有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)