2012-07-23 17 views
5

यदि कोई सर्वोत्तम अभ्यास है, या इसे पूरा करने के लिए अनुशंसित तरीका है तो मैं उत्सुक हूं?Django - मॉडल पर फ़िल्टर को ओवरराइड कैसे करें?

class Cat(models.Model): 
    field1=models.CharField(...) 
    field2=models.CharField(...) 
    evil=models.BooleanField(...) 

मेरा लक्ष्य क्या है कोशिश कर रहा हूँ मैं कोई भी दृश्य नहीं कभी बिल्ली रिकॉर्ड तक पहुँचने के लिए जहां बुराई सच है सक्षम होने के लिए चाहते हैं:

मैं इस तरह एक मॉडल है कहो।

क्या मुझे वास्तव में प्रत्येक Cat.objects.filter कॉल में फिफ्टर (बुराई = झूठा) जोड़ने की ज़रूरत है, या कक्षा में एक बार ऐसा करने का कोई तरीका है और बुराई बिल्लियों को कभी भी कहीं भी नहीं दिखाना है?

+1

मुझे लगता है कि एक कस्टम प्रबंधक यहां जाने का रास्ता है: https://docs.djangoproject.com/en/dev/topics/db/प्रबंधकों/# कस्टम-प्रबंधकों – Jingo

+0

मैं @ जिंगो से सहमत हूं। इसे एक उत्तर दें और आपका वोट है। –

+0

धन्यवाद जिंगो। यह आशाजनक लग रहा है। अगर यह काम करता है तो मैं अपना जवाब यहां लिखूंगा। मैं अभी भी उत्सुक हूं अगर किसी और के पास अलग-अलग विचार हैं लेकिन मैं इसे एक शॉट दूंगा। – Greg

उत्तर

8

ठीक है, एक कस्टम मैनेजर यहां फिट हो सकता है। बस docs पर एक नज़र डालें। और क्रिस प्रैट की तरह कहा, ध्यान रखें कि पहला प्रबंधक डिफ़ॉल्ट हो जाता है।

आशा है कि यह सही दिशा में आगे बढ़ेगा।

अद्यतन (हो सकता है आप इसे इस तरह कर सकता है):

from django.db import models 

class EvilCategoryManager(models.Manager): 
    def get_query_set(self): 
     return super(EvilCategoryManager, self).get_query_set().filter(evil=False) 

class Cat(models.Model): 
    #.... atrributes here 
    objects = models.Manager() 
    no_evil_cats = EvilCategoryManager() 
+0

धन्यवाद, क्या आपका मतलब रिटर्न सुपर (EvilCategoryManager ...? – Greg

+0

हां दाएं, बस मेरे टाइपो को संपादित किया गया। – Jingo

+1

आप अभी 'सुपर (EvilCategoryManager, self) क्यों नहीं लौटते हैं। फ़िल्टर (बुरा = गलत) ' – kosii

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