2013-01-13 23 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.

वाह, यह आश्चर्यजनक परिणाम सेट करने के लिए मन Bender है हो आप चाहते हैं वहाँ के बाद से वास्तव में 2 अलग तार्किक प्रश्नों। सबसे सरल तरीका है ... इसे अजगर के साथ जादू करना।

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