2010-12-15 8 views
5

Ho dichiarato un gestore per il modello seguente, ma dopo averlo fatto, non posso più utilizzare List.objects.get(). Qualcuno sa perché?Perché dichiarare un gestore a un modello Django, annullare "oggetti"

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

    archived_lists = ArchivedListManager() 
    active_lists = ActiveListManager() 

E i gestori:

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) 

l'errore è type object 'List' has no attribute 'objects'

risposta

19

Come indicato nella Django docs:

Se si utilizza personalizzati Manager oggetti, prendere atto che la prima Manager Django incontra (nell'ordine in cui sono definite nel modello) ha uno stato speciale Django interpreta il primo Manager definito in una classe come "predefinito" Manager, e diverse parti di Django useranno tale Manager esclusivamente per quel modello. Di conseguenza, è una buona idea fare attenzione nella scelta del gestore predefinito per evitare una situazione in cui l'annullamento di get_query_set() determina l'impossibilità di recuperare gli oggetti con cui si desidera lavorare.

Quindi, per quanto riguarda il "perché", è per consentire all'utente di fornire il proprio gestore predefinito.

La soluzione è semplice, però: basta aggiungere questo

objects = models.Manager() 

alla classe del modello.

0

Aggiungere il proprio responsabile sopprime la creazione dello stock responsabile.

"Manager names"

+0

ho fatto questo manager "di classe ListManager (models.Manager): def get_query_set (self): ritorno super (ListManager, auto) .get_query_set()" che stampa gli oggetti corretti con List.objects, ma non riesce con "List.objects.get (esempio = esempio) Come posso risolverlo? – Josh

+0

Sembra una domanda completamente separata. –