2011-10-07 5 views
23

Dopo aver letto su Django Managers, non sono ancora sicuro di quanti benefici otterrò usandolo. Sembra che l'utilizzo migliore sia l'aggiunta di metodi personalizzati di query (di sola lettura) come XYZ.objects.findBy*(). Ma posso farlo facilmente con metodi statici al di fuori delle classi Model.Utilizzo di Django Manager rispetto a staticmethod sulla classe Model direttamente

Io preferisco il secondo sempre a causa:

  1. codice località in termini di leggibilità e di più facile manutenzione
  2. leggermente meno verbose, come non ho bisogno la proprietà objects nelle mie chiamate
  3. Manager classi hanno strane regole riguardanti l'ereditarietà del modello, potrebbe anche tenersi discosta da ciò.

C'è qualche buona ragione non per utilizzare metodi statici e utilizzare invece classi Manager?

risposta

28

L'aggiunta di query personalizzate ai gestori è la convenzione di Django. Dal documento Django su custom managers:

L'aggiunta di metodi Manager aggiuntivi è il modo preferito per aggiungere funzionalità "a livello di tabella" ai modelli.

Se si tratta della tua app privata, la parola convenzione non ha importanza, infatti la base di codice interna della mia azienda ha alcuni metodi di classe che possono appartenere ad un gestore personalizzato.

Tuttavia, se stai scrivendo un'app che stai per condividere con altri utenti Django, allora si aspettano di vedere findBy su un gestore personalizzato.

Non penso che i problemi di ereditarietà di cui parli siano troppo negativi. Se leggi il custom managers and model inheritance docs, non credo che ti farai scoprire. Il livello di dettaglio della scrittura .objects è sopportabile, così come è quando facciamo query utilizzando XYZ.objects.get() e XYZ.objects.all()

Ecco alcuni vantaggi di utilizzare metodi di gestore, a mio parere:

  1. Consistenza API. Il tuo metodo findBy appartiene a get, filter, aggregate e il resto. Vuoi sapere quali ricerche puoi fare sul gestore di XYZ.objects? È semplice quando puoi introspettarti con dir(XYZ.objects).

  2. I metodi statici "ingombrano" lo spazio dei nomi dell'istanza. XYZ.findBy() va bene ma se si definisce un metodo statico, è anche possibile eseguire xyz.findBy(). L'esecuzione della ricerca findBy su un'istanza particolare non ha realmente senso.

  3. ASCIUGATURA. A volte è possibile utilizzare lo stesso gestore su più di un modello.

Detto questo, dipende da voi. Non sono a conoscenza di un motivo killer per cui non dovresti usare un metodo statico.Sei un adulto, è il tuo codice e se non vuoi scrivere findBy come metodo manager, il cielo non cadrà;)

Per ulteriori letture, consiglio il post sul blog Managers versus class methods di James Bennett, il manager di rilascio di Django.

+4

Grazie mille, la tua spiegazione ha senso e il link che hai aggiunto è molto utile! – Xerion

Problemi correlati