2013-02-04 3 views
6

Ho letto la definizione nel Django ufficiale documentation e sono ancora confuso da ciò che fa un Manager.Che cos'è un "Manager" in django?

La documentazione dice che consentono di operare su tabelle/modelli di database. Ma ancora non lo capisco.

Qualcuno può spiegare manager e il loro ruolo per me? Una risposta con un esempio sarebbe preferibile.

+0

'Managers' sono un bel classe di Django complesso, se siete nuovi a Programmi Mi piacerebbe attenermi al [tutorial] (https://docs.djangoproject.com/en/dev/intro/tutorial01/) finché non sarai più sicuro del codice. – danodonovan

risposta

5

Un manager è in genere qualcosa di nascosto dai programmatori di django che django utilizza per interfacciarsi tra il codice model e il back-end del database.

Quando si esegue una query l'ORM Django, lo fa attraverso inviti a

from my_app.models import MyModel 

mms = MyModel.objects.all() 

In questo caso, la parte objects della funzione è ciò che viene restituito dal gestore. Se si voleva MyModel per sempre e solo ottenere blueMyModel casi (il database potrebbe contenere red modelli troppo) allora si potrebbe creare un gestore e incidere il vostro modello così

class BlueManager(models.Manager): 
    def get_query_set(self): 
     return super(BlueManager, self).get_query_set().filter(colour='Blue') 

class MyModel(models.Model): 
    colour = models.CharField(max_length=64) 
    blue_objects = BlueManager() 

e chiamando

MyModel.blue_objects.all() 

sarebbe solo ritorno oggetti con colour come blue. Nota, questo è un modo molto povero per filtrare i modelli!

Uno sarebbe di solito necessario modificare un'interfaccia Manager se avevano intenzione di modificare le QuerySet s che un manager di solito ritorno o se è necessario aggiungere "tabella" query di livello (invece di regolare il livello di Django "riga"). Il documentation per i gestori è abbastanza completo e contiene diversi esempi.

+0

Per ulteriori crediti, leggi il codice sorgente su github. https://github.com/django/django/blob/master/django/db/models/manager.py –

3

Manager è una sorta di "porta" tra applicazione e database. Una cosa buona è che puoi definire il tuo queryset di base per il modello. Per esempio: se si dispone di modello di 'Book' con il campo di 'disponibilità', si può preparare il proprio set di query, che il re specifico filtro della disponibilità Tipo:

models.py:

class AvailableBookManager(models.Manager): 
    def get_query_set(self): 
     return super(AvailableBookManager, self).get_query_set().filter(availability=1) 

class Book(models.Model): 
    (...)#fields definition 

    objects = models.Manager() #default manager 
    available_objects = AvailableBookManager() #own manager 

e ora è possibile utilizzare :

books = Book.available_objects.all() 

isntead di:

books = Book.objects.filter(available=1)