2010-12-15 9 views
5

Ich habe einen Manager für das folgende Modell, aber nachdem ich dies getan habe, kann ich nicht mehr List.objects.get() verwenden. Jeder weiß warum?Warum deklariert ein Manager zu einem Django-Modell, "Objekte" ungültig

class List(models.Model): 
    title = models.CharField(max_length=20, unique=True) 
    archived = models.BooleanField() 

    archived_lists = ArchivedListManager() 
    active_lists = ActiveListManager() 

Und die Manager:

class ArchivedListManager(models.Manager): 
    def get_query_set(self): 
    return super(ArchivedListManager, self).get_query_set().filter(archived=True) 

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

Der Fehler ist type object 'List' has no attribute 'objects'

Antwort

19

Wie in der Django docs bemerkt:

Wenn Sie benutzerdefinierte Manager Objekte verwenden, nehmen Sie zur Kenntnis, dass die erste Manager Django trifft (in der Reihenfolge, in der sie im Modell definiert sind) hat einen besonderen Status. Django interpretiert die erste in einer Klasse definierte Manager als "Standard" Manager, und mehrere Teile von Django verwenden diese Manager ausschließlich für dieses Modell. Daher ist es eine gute Idee, bei der Auswahl des Standard-Managers vorsichtig zu sein, um eine Situation zu vermeiden, in der das Überschreiben get_query_set() dazu führt, dass Objekte, mit denen Sie arbeiten möchten, nicht abgerufen werden können.

So weit wie "warum" geht, ist es, Ihnen zu erlauben, Ihren eigenen Standardmanager zur Verfügung zu stellen.

Die Lösung ist einfach, aber: nur diese Klasse

objects = models.Manager() 

zu Ihrem Modell hinzufügen.

0

Ihren eigenen Manager Hinzufügen Erstellung des Aktien Manager unterdrückt.

"Manager names"

+0

Ich habe diese Manager "Klasse Listmanager (models.Manager): def get_query_set (self): return Super (Listmanager, Selbst-) .get_query_set()", die die richtigen Objekte mit List.objects druckt, aber es funktioniert nicht mit "List.objects.get (Beispiel = Beispiel) Wie kann ich das beheben? – Josh

+0

Das klingt nach einer völlig anderen Frage. –