2009-01-24 14 views
26

द्वारा एक क्वेरीसमूह चलो कहते हैं कि मैं निम्नलिखित मॉडल हैं:आदेश कुल क्षेत्र मूल्य

class Contest: 
    title = models.CharField(max_length = 200) 
    description = models.TextField() 

class Image: 
    title = models.CharField(max_length = 200) 
    description = models.TextField() 
    contest = models.ForeignKey(Contest) 
    user = models.ForeignKey(User) 

    def score(self): 
     return self.vote_set.all().aggregate(models.Sum('value'))[ 'value__sum' ] 

class Vote: 
    value = models.SmallIntegerField() 
    user = models.ForeignKey(User) 
    image = models.ForeignKey(Image) 

एक साइट के उपयोगकर्ताओं कई प्रतियोगिताओं के लिए उनके चित्र योगदान कर सकते हैं। फिर अन्य उपयोगकर्ता उन्हें ऊपर या नीचे वोट दे सकते हैं। सब कुछ ठीक काम करता है, लेकिन अब मैं एक ऐसा पृष्ठ प्रदर्शित करना चाहता हूं जिस पर उपयोगकर्ता किसी निश्चित प्रतियोगिता में सभी योगदान देख सकें। छवियों को उनके स्कोर द्वारा आदेश दिया जाएगा। जैसा कि मैंने के बाद से 'स्कोर' कोई डाटाबेस क्षेत्र है कि प्रश्नों में इस्तेमाल किया जा सकता है यह काम नहीं करता आशंका

Contest.objects.get(pk = id).image_set.order_by('score') 

: इसलिए मैं निम्नलिखित की कोशिश की।

उत्तर

47

ओह, निश्चित रूप से मैं Django और annotate कार्यक्षमता में नए एकत्रीकरण समर्थन के बारे में भूल जाता हूं।

तो क्वेरी कुछ ऐसा दिखाई देगा:

Contest.objects.get(pk=id).image_set.annotate(score=Sum('vote__value')).order_by('score') 
+0

ग्रेट सॉल्यूशन! :) – okoman

+0

मुझे परिणाम के परिणाम मिल रहे हैं ... वे ज्यादातर क्रम में हैं, लेकिन कुछ उनमें से गलत हैं ... इसका कारण क्या हो सकता है? – Jiaaro

+0

यह केवल उस विशिष्ट मामले के लिए समाधान है, न कि प्रश्न शीर्षक के लिए: "विधि द्वारा क्वेरीसेट आदेश"। विधि द्वारा क्वेरीसेट को ऑर्डर करने का यह समाधान नहीं है: @ एसएलॉट प्रतिक्रिया सामान्य मामले के लिए सही समाधान है –

9

आप पाइथन में अपना खुद का प्रकार बहुत आसानी से लिख सकते हैं।

def getScore(anObject): 
    return anObject.score() 
objects= list(Contest.objects.get(pk = id).image_set) 
objects.sort(key=getScore) 

यह अच्छी तरह से काम करता है क्योंकि हमने सूची को क्रमबद्ध किया है, जिसे हम टेम्पलेट को प्रदान करने जा रहे हैं।

+0

हाँ, आप कर सकते हैं। आप सिर्फ क्वेरी के हिस्से के रूप में योग करते हैं। –

+0

'relatedManager' ऑब्जेक्ट में कोई विशेषता नहीं है 'sort' :( – okoman

+2

@okoman ... इसका मतलब है कि आप सूची() फ़ंक्शन – Jiaaro

1

डीबी-स्तर order_by मॉडल की पायथन विधि द्वारा क्वेरीसेट को सॉर्ट नहीं कर सकता है।

समाधान score फ़ील्ड Image मॉडल को पेश करना है और इसे प्रत्येक Vote अद्यतन पर पुन: गणना करना है। कुछ प्रकार के denormalization। जब आप इसे सॉर्ट कर सकते हैं।

+0

मुझे यकीन नहीं है कि * सबसे अच्छा * समाधान, लेकिन यह * ए * समाधान है। –

+0

ओह, हाँ, मैं सहमत हूं। –

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