2012-07-23 16 views
5

Sono curioso di sapere se esiste una best practice o un modo consigliato per farlo?Django - Come sovrascrivere il filtro su un modello?

dire che ho un modello come questo:

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

Quello che sto cercando di realizzare è che voglio senza vista per essere sempre in grado di accedere ai record Cat dove il male è vero.

Ho davvero bisogno di aggiungere .filter (evil = False) a ogni chiamata Cat.objects.filter, o c'è un modo per farlo una volta in classe e far sì che i cattivi gatti non si presentino mai da nessuna parte?

+1

Penso che un manager personalizzato è il modo di andare qui: https://docs.djangoproject.com/en/dev/topics/db/manager/# custom manager – Jingo

+0

Accetto @Jingo. Fagli una risposta e hai il mio voto. –

+0

Grazie Jingo. Sembra promettente. Se funziona, scriverò la mia risposta qui. Sarei ancora curioso di sapere se qualcun altro ha idee diverse ma darò una possibilità. – Greg

risposta

8

Ok, un gestore personalizzato potrebbe rientrare qui. Dai un'occhiata allo docs. E come ha detto Chris Pratt, tieni presente che il primo manager diventa quello predefinito.

Spero che questo conduca nella giusta direzione.

Update (forse si potrebbe fare in questo modo):

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

Grazie, intendi return super (EvilCategoryManager ...? – Greg

+0

Sì, ho appena modificato il mio errore di battitura – Jingo

+1

Perché non restituisci semplicemente 'super (EvilCategoryManager, self) .filter (evil = False)'? – kosii

Problemi correlati