2010-03-23 16 views
35

यह लगभग निश्चित रूप से एक डुप्लिकेट प्रश्न है, जिस मामले में माफी माँगती है, लेकिन मैं SO पर लगभग आधे घंटे की खोज कर रहा हूं और यहां जवाब नहीं मिल रहा है। मैं शायद गलत खोज शब्द का उपयोग कर रहा हूँ, क्षमा करें।विदेशीकी फ़ील्ड की गिनती के अनुसार आदेश?

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

class Submission(models.Model): 
    uploaded_by = models.ForeignKey('User') 
class User(models.Model): 
    name = models.CharField(max_length=250) 

मेरा प्रश्न बहुत सरल है: मैं सबसे प्रविष्टियों के तीन उपयोगकर्ताओं की सूची कैसे मिल सकता है?

मैं उपयोगकर्ता मॉडल पर एक num_submissions विधि बनाने की कोशिश की:

def num_submissions(self): 
    num_submissions = Submission.objects.filter(uploaded_by=self).count() 
    return num_submissions 

और फिर कर:

top_users = User.objects.filter(problem_user=False).order_by('num_submissions')[:3] 

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

उत्तर

84
from django.db.models import Count 
top_users = User.objects.filter(problem_user=False) \ 
       .annotate(num_submissions=Count('submission')) \ 
       .order_by('-num_submissions')[:3] 

आप अपने उदाहरण मॉडल कोड में problem_user का उल्लेख नहीं था, लेकिन मैं यह सोचते हैं कि यह User पर एक BooleanField है में छोड़ दिया गया है।

+2

बहुत अच्छा, यह 'Profile.objects.annotate (num_items = count (' user__item ') के साथ ईवेंट का काम करता है)। Order_by (' - num_items ') ' – skrat

+0

हाय, मैं पूछना चाहता हूं कि फिल्टर करने का कोई तरीका है या नहीं पिछले 24 घंटों में केवल अधिकांश सबमिशन वाले उपयोगकर्ता? मान लीजिए कि सबमिशन में टाइमस्टैम्प फ़ील्ड है। –

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