django

2010-03-22 20 views
20

में डिफ़ॉल्ट क्वेरीसेट संशोधित करें मैंने अपने मॉडल में 'रद्द' फ़ील्ड जोड़ा है, क्या मॉडल डिफ़ॉल्ट डिफ़ॉल्ट क्वेरी को रद्द करने का कोई तरीका है जैसे रद्द = गलत? मेरे सभी फ़िल्टर/बहिष्कृत प्रश्नों को संशोधित किए बिना?django

उत्तर

29

आप इसे कस्टम मॉडल मैनेजर के साथ कर सकते हैं और get_queryset फ़ंक्शन को हमेशा रद्द करने के लिए ओवरराइड कर सकते हैं = गलत।

class CustomManager(models.Manager): 
    def get_queryset(self): 
     return super(CustomManager, self).get_queryset().filter(canceled=False) 

class MyModel(models.Model): 
    # Blah blah 
    objects = CustomManager() 

फिर MyModel.objects.all() पर कॉल करते समय यह हमेशा रद्द वस्तुओं को बाहर कर देगा। यहां एक ब्लॉग पोस्ट है जिसे मैंने विषय पर सहायक पाया। http://www.b-list.org/weblog/2006/aug/18/django-tips-using-properties-models-and-managers/

संपादित करें:

class MyModel(models.Model): 
    # Blah blah 
    active = CustomManager() 

और अपने विचारों में आपके प्रश्नों MyModel.active.all() दिखाई देगा: शायद एक कस्टम प्रबंधक के साथ एक बेहतर दृष्टिकोण यह इस तरह के रूप वस्तुओं के अलावा, एक और संपत्ति को संलग्न करने के लिए, हो जाएगा।

EDIT2: get_query_set से get_queryset से अद्यतन विधि वर्तनी django के आधुनिक संस्करणों के लिए।

+2

आपको इस तरह के डिफ़ॉल्ट प्रबंधक को ओवरराइड करने के साथ बहुत सावधान रहना होगा। इस विशेष मामले में, एक बार आइटम रद्द हो जाने पर, आपको कभी भी फ़िल्टर()/get() के साथ नहीं मिलेगा। –

+1

सहमत हुए। यदि मैं पीके दिया जाता है तो इस फ़िल्टर का उपयोग न करने के लिए ओवरराइडिंग() को ओवरराइड करने के साथ आमतौर पर इस दृष्टिकोण को पूरक करता हूं। आप शायद रद्द किए गए सभी को वापस करने के लिए व्यवस्थापक क्वेरीसेट को भी बदलना चाहते हैं। लेकिन यदि आप शायद ही कभी अपने प्रश्नों में रद्द आइटम चाहते हैं तो यह एक उचित दृष्टिकोण हो सकता है। –

+1

नमस्ते, क्या अतिरिक्त पैरामीटर का उपयोग करने के लिए get_query_set के व्यवहार को संशोधित करने का कोई तरीका है यानी कहीं से पारित किया गया है, या वर्तमान लॉगिन उपयोगकर्ता जानकारी जैसे वैश्विक चर का उपयोग करें? धन्यवाद! – ultrajohn

4

आप कस्टम query manager लिख सकते हैं, लेकिन मुझे विश्वास नहीं है कि यह जाने का सही तरीका है। यह फ़िल्टर के लिए एक अंतर्निहित, छिपी स्थिति बनाएगा, जो कोड को पढ़ने योग्य नहीं करेगा। पायथन के जेन को याद रखें: Explicit is better than implicit। स्थानों का पता लगाएं, जहां आपको रद्द = गलत जोड़ने की आवश्यकता है और बस इसे जोड़ें, वैसे ही आपको यह करना चाहिए।

+5

मैं दृढ़ता से असहमत हूं। फिर, कस्टम प्रबंधकों का क्या मतलब होगा? 'Not_cancelled = CustomManager()' और फिर MyModel.not_cancelled.all() का उपयोग करने के बारे में इतना अंतर्निहित क्या है? – jonwd7