2012-06-11 11 views
6

तो में एक विधि द्वारा Django मॉडल आदेश, मैं इस तरह मॉडल कहते हैं:मॉडल

class FooAdmin(ModelAdmin): 
    list_display = ['name', 'latest_comment'] 
    ordering = ['latest_comment'] 

admin.site.register(Foo, FooAdmin) 

यह एक त्रुटि फेंकता है जब मैं इस पर जाएं:

class Foo(Model): 
    name = CharField(max_length=200) 
    def latest_comment(self): 
     try: 
      object = self.comment_set.latest() 
      if object: 
       return object.when_posted.date() 
     except: 
      return "" 

class Comment(Model): 
    when_posted = DateTimeField() 
    text = TextField() 

फिर इस modelAdmin है व्यवस्थापक साइट कह रही है कि 'latest_comment' ऐप में नहीं मिला था। फू। List_display में यह ठीक काम करता है। तो, मेरा सवाल है: मॉडल के तरीकों से list_display में मॉडलों को ऑर्डर करने का कोई तरीका है? और यदि हां, तो कैसे?

उत्तर

3

मैं कोड का परीक्षण नहीं किया, लेकिन सिर्फ एक विचार के रूप में एक व्याख्या समारोह के साथ ModelAdmin की क्वेरीसमूह अधिभावी के साथ इस लागू करने के लिए संबंधित क्षेत्र से एक क्षेत्र पर सुलझाने की कोशिश करने के लिए:

class FooAdmin(admin.ModelAdmin): 
    def queryset(self, request): 
     qs = super(FooAdmin, self).queryset(request) 

     return qs.distinct() \ 
     .annotate(date_of_last_comment=Max('comment__date')) \ 
     .order_by('-date_of_last_comment') 
+0

यह बहुत अच्छा काम करता है, सिर्फ एक समस्या है। एक बार इसे बदलने के बाद उस क्रम में वापस जाने का कोई तरीका नहीं है (एक नाम पर, यदि उसके लिए कोई फ़ील्ड था)। लेकिन धन्यवाद, यह कम से कम थोड़ी देर के लिए करना चाहिए। – uncleshelby

1

ऑर्डरिंग एक SQL-स्तर कार्यक्षमता है और आपका डेटाबेस आपके मॉडल के तरीकों के बारे में कुछ भी नहीं जानता है।

हालांकि, आप अपनी क्वेरीसेट को किसी सूची में परिवर्तित करके और फिर sorted जैसे कुछ का उपयोग करके इस तथ्य के बाद फिर से सॉर्ट कर सकते हैं। देखें: http://wiki.python.org/moin/HowTo/Sorting/

हालांकि इसके लायक होने के लिए, मुझे संदेह है कि क्रमबद्ध सूची व्यवस्थापक में काम करेगी। मैं गलत हो सकता था, लेकिन मुझे यकीन है कि Django को एक क्वेरीसेट रहने के लिए इसकी आवश्यकता है।

0

django doc से, आप शायद अपनी खुद की get_ordering विधि परिभाषित कर सकते हैं।

+0

कि नहीं करता है समस्या हल नहीं है। 'get_ordering' केवल आपको क्रमिक रूप से ऑर्डरिंग निर्दिष्ट करने की अनुमति देता है; आप * अभी भी * वास्तविक डीबी क्षेत्रों का उपयोग करना चाहिए, मॉडल पर एक विधि नहीं। –

+0

अच्छी टिप्पणी, वास्तव में यह आपको आदेश को अनुकूलित करने की अनुमति नहीं देता है। – Emmanuel