2010-05-04 14 views
7

पार एकत्रीकरण इन दो मॉडलों को देखते हुए:Django रिवर्स रिश्ता

class Profile(models.Model): 
    user = models.ForeignKey(User, unique=True, verbose_name=_('user')) 
    about = models.TextField(_('about'), blank=True) 
    zip = models.CharField(max_length=10, verbose_name='zip code', blank=True) 
    website = models.URLField(_('website'), blank=True, verify_exists=False) 

class ProfileView(models.Model): 
    profile = models.ForeignKey(Profile) 
    viewer = models.ForeignKey(User, blank=True, null=True) 
    created = models.DateTimeField(auto_now_add=True) 

मैं सभी प्रोफाइल कुल दृश्य के अनुसार क्रमबद्ध प्राप्त करना चाहते हैं। मैं के साथ कुल दृश्य के अनुसार क्रमबद्ध प्रोफाइल आईडी की एक सूची प्राप्त कर सकते हैं:

ProfileView.objects.values('profile').annotate(Count('profile')).order_by('-profile__count') 

लेकिन वह सिर्फ प्रोफाइल आईडी का एक शब्दकोश, जिसका मतलब है मैं तो इस पर पाश करने के लिए है और एक साथ प्रोफ़ाइल वस्तुओं की एक सूची डाल है। जो कई अतिरिक्त प्रश्न हैं और अभी भी एक क्वेरीसेट नहीं है। उस बिंदु पर, मैं कच्चे एसक्यूएल को भी छोड़ सकता हूं। इससे पहले कि, प्रोफाइल मॉडल से ऐसा करने का कोई तरीका है? प्रोफाइल व्यू एक विदेशी के क्षेत्र से संबंधित हैं, लेकिन ऐसा नहीं है कि प्रोफाइल मॉडल जानता है, इसलिए मुझे यकीन नहीं है कि दोनों को एक साथ कैसे बांधें।

एक तरफ के रूप में, मुझे एहसास है कि मैं प्रोफ़ाइल मॉडल पर एक संपत्ति के रूप में विचारों को स्टोर कर सकता हूं और जो मैं यहां करता हूं, वह हो सकता है, लेकिन मुझे अभी भी एग्रीगेशन फ़ंक्शंस का बेहतर उपयोग करने के तरीके सीखने में दिलचस्पी है।

उत्तर

9

ProfileViews एक ForeignKey क्षेत्र के माध्यम से जुड़े हुए हैं, लेकिन यह के रूप में यद्यपि प्रोफ़ाइल मॉडल जानता

प्रोफ़ाइल मॉडल वास्तव में उस को पता है कि नहीं है।

Profile.objects.all().annotate(count_views=Count('profileview__pk')).order_by('count_views') 

संपादित: यहाँ आप लुकअप कि रिश्तों अवधि के बारे में Django डॉक्स पा सकते हैं http://docs.djangoproject.com/en/dev/topics/db/queries/#lookups-that-span-relationships

+0

'django.db.models से आयात करें ' – juanjo

3

निश्चित रूप से यह काम करेगा:

Profile.objects.all().annotate(viewcount=Count('profileview')).order_by('-viewcount') 

रूप आप की तरह कुछ करने के लिए सक्षम होना चाहिए बोटोंडस का कहना है कि प्रोफाइल मॉडल पीछे के विदेशी मुद्रा संबंधों से अवगत है।

संबंधित मुद्दे