2013-01-13 11 views
5

Rozważmy następujący model Przyjaźń, gdzie dla każdej przyjaźni wykonana, jest Użytkownik, który wysłałprośbę przyjaciela, a użytkownik, który odebrany prośbę przyjaciela:Django: Zapytanie dostać User.usernames za pośrednictwem klucza obcego

from django.contrib.auth.models import User 

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

Jak skonstruować kwerendę, która dałaby mi wszystkie nazwy użytkownika z użytkowników, którzy znajdują się w przyjaźń z, powiedzmy, user123?

Pamiętaj, mógłby user123 być nadawca lub odbiorca jakiejkolwiek przyjaźni on znajduje.

Również chcę tylko wartości user.username zostać zwrócone, a nie całego obiektu użytkownika.


tej pory mam ten przylegający połowa/rozwiązanie (używam list() tak, że mogę dodać obie user123 za otrzymujących znajomych i user123 za wysyłaniem znajomych, aby ostatecznie stworzyć listę wszystkich znajomych) . Problem polega na tym, że otrzymuję wszystkie obiekty użytkownika, a ja chcę tylko nazwy użytkowników ... i musi być lepszy sposób na zrobienie tego.

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 

Odpowiedz

4

Q Objects for complex lookups.

Wow, to jest zaskakująco Bender umysł, aby uzyskać wynik ustawić chcesz, ponieważ nie jest faktycznie 2 różne zapytań logicznych. Najprostszym sposobem jest ... przeliterowanie go pythonem.

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

Cholera, dobrze zrobione. Miałem nadzieję, że uda mi się to osiągnąć za pomocą pojedynczego złożonego zapytania, ale to zdecydowanie wykonuje swoją pracę. – sgarza62