2012-07-23 7 views
5

Ich bin neugierig, ob es eine Best Practice oder eine empfohlene Methode gibt, dies zu erreichen?Django - Wie man Filter auf einem Modell überschreibt?

sagen, dass ich ein Modell wie dieses:

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

Was ich versuche ich keine Ansichten Cat Datensätze zugreifen zu können, jemals erreichen wollen, wo das Böse Wahre ist.

Muss ich wirklich Filter (evil = False) zu jedem Cat.objects.filter-Aufruf hinzufügen, oder gibt es eine Möglichkeit, es einmal in der Klasse zu tun und die bösen Katzen niemals irgendwo auftauchen zu lassen?

+1

Ich denke, ein benutzerdefinierter Manager ist der Weg hier zu gehen: https://docs.djangoproject.com/en/dev/topics/db/managers/# custom-managers – Jingo

+0

Ich stimme @Jingo zu. Mach es zur Antwort und du hast meine Stimme. –

+0

Danke Jingo. Das sieht vielversprechend aus. Wenn es klappt, werde ich hier meine eigene Antwort schreiben. Ich wäre immer noch neugierig, ob jemand anders andere Ideen hat, aber ich gebe Ihnen eine Chance. – Greg

Antwort

8

Ok, ein Custom Manager könnte hier reinpassen. Schauen Sie einfach in die docs. Und wie Chris Pratt sagte, bedenke, dass der erste Manager der Standardmanager wird.

Hoffe das führt in die richtige Richtung.

Update (vielleicht haben Sie es so tun könnten):

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

Danke, meinst du Rückkehr super (EvilCategoryManager ...? – Greg

+0

Richtig, habe gerade meinen Tippfehler bearbeitet. – Jingo

+1

Warum gibst du nicht einfach 'super (EvilCategoryManager, self) .filter (evil = False)'? – kosii

Verwandte Themen