2012-01-23 66 views
1

我的問題,如何重寫模型管理器的方法來傳遞默認參數,如果它沒有明確設置?get()或filter()方法中的Django模型默認參數

說我有一個模型,輸入:

class Entry(models.Model): 

    user = models.ForeignKey(User, verbose_name=_("user")) 
    text = models.CharField(max_length=200) 
    date = models.DateTimeField(auto_now_add=True) 
    deleted = models.BooleanField(default=False) 

現在不知何故,我想在所有的get()和過濾器()方法添加參數deleted=False如果該參數不明確設置(我的意思是像Entry.objects.filter(deleted=True)東西默認參數不應該覆蓋所呈現的一個)。

我所做的是創建EntryManager並將其設置爲Entry模型中的管理器。

def filter(self, *args, **kwargs): 
    deleted = kwargs.get('deleted', False) 
    kwargs.update({'deleted':deleted}) 
    return super(EntryManager, self).get(*args, **kwargs) 

但它並不適用於情況deleted__in=(True, False)工作,這不奇怪,但我不知道如何如何做到這一點的權利: 濾波器()方法EntreManager。 在此先感謝。 順便說一句我用django 1.3.1

回答

8

你應該覆蓋經理的get_query_set方法,如here所述。在你的情況,你可以做這樣的事情:

def get_query_set(self): 
    return super(EntryManager, self).get_query_set().filter(deleted=False) 
+0

通過這樣的情況下這樣做時,我明確地設置參數刪除過濾器而不會覆蓋=真,查詢我得到.... WHERE(」入門「。」已刪除「=假和」入門「。」已刪除「=真) – tony

+1

@tony:你會想要有兩個管理員,通用的'對象'管理器和專門的過濾管理器(稱爲'deleted'或somesuch )。 – mipadi

+0

現在我明白了,謝謝! – tony