2010-12-15 17 views
5

Ogłosiłem menedżera następującego modelu, ale po tym nie mogę już używać List.objects.get(). Ktoś wie dlaczego?Dlaczego deklarowanie menedżera do modelu Django, anulowanie "obiektów"

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

    archived_lists = ArchivedListManager() 
    active_lists = ActiveListManager() 

i zarządców:

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) 

błąd jest type object 'List' has no attribute 'objects'

Odpowiedz

19

Jak zaznaczono w Django docs:

Jeśli używasz niestandardowych Manager obiektów, warto pamiętać, że pierwszy Manager Django napotyka (w kolejności, w jakiej są one zdefiniowane w modelu) ma specjalny status. Django interpretuje pierwszy kod Manager zdefiniowany w klasie jako "domyślny" Manager, a kilka części Django będzie używać tego Manager wyłącznie dla tego modelu. W związku z tym dobrze jest zachować ostrożność przy wyborze domyślnego menedżera, aby uniknąć sytuacji, w której przesłonięcie get_query_set() powoduje niemożność pobrania obiektów, z którymi chciałbyś pracować.

Jeśli chodzi o "dlaczego", pozwala to na zapewnienie własnego domyślnego menedżera.

Rozwiązanie jest proste, ale: po prostu dodać ten

objects = models.Manager() 

do swojej klasie modelu.

0

Dodawanie własnego menedżera hamuje tworzenie kierownika Seryjna.

"Manager names"

+0

Zrobiłem ten manager "klasa ListManager (models.Manager): def get_query_set (self): return super (ListManager, self) .get_query_set()", która drukuje odpowiednie obiekty z List.objects, ale nie jest on z "List.objects.get (example = example) Jak mogę to naprawić? – Josh

+0

To brzmi jak całkowicie oddzielne pytanie. –