2012-07-23 35 views
5

我很好奇,如果有最佳做法,或推薦的方法來實現這一目標?Django - 如何覆蓋模型上的過濾器?

說我有這樣一個模型:

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

我試圖做到的是我不想要的意見永遠能夠訪問目錄記錄,其中的邪惡是真實的。

我是否真的需要爲每個Cat.objects.filter調用添加.filter(evil = False),還是有一種方法可以在課堂上做到這一點,並讓邪惡的貓永遠不會出現在任何地方?

+1

我覺得一個自定義的經理是去這裏的路:https://docs.djangoproject.com/en/dev/topics/db/managers /#custom-managers – Jingo 2012-07-23 17:53:16

+0

我同意@Jingo。讓它成爲答案,你有我的投票。 – 2012-07-23 17:54:45

+0

謝謝金戈。這看起來很有希望。如果它解決了,我會在這裏寫下我自己的答案。如果有其他人有不同的想法,我仍然會好奇,但我會給這個機會。 – Greg 2012-07-23 17:55:53

回答

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 2012-07-23 19:36:46

+0

)Ya對,剛剛編輯我的輸入錯誤。 – Jingo 2012-07-23 20:13:42

+1

爲什麼不直接返回'super(EvilCategoryManager,self).filter(evil = False)'? – kosii 2012-07-23 22:18:46