2013-01-13 130 views
5

得到User.usernames考虑下面的友谊模式,即对每一个做友谊,有一个用户谁发送的好友请求,谁收到朋友请求的用户:Django的:查询通过外键

from django.contrib.auth.models import User 

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

我将如何构建一个查询会给我所有的用户名谁在用,比如说user123一个友好的用户?

请记住,user123可能是发送者或任何交情,他是。

同样的接收器,我只想返回User.username值,而不是整个用户对象。


到目前为止,我有这个笨重的半/溶液(我使用list(),这样我可以同时添加user123的接收朋友和user123的送朋友,最终产生的所有朋友的列表) 。问题是,我得到所有的用户对象,我只想要用户名...并且有一个更好的方法来做到这一点。

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

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) 
+0

该死的,干得好。希望我能通过一个复杂的查询来实现它,但是这绝对能够完成这项工作。 – sgarza62