2009-12-10 14 views
20

Questa è una domanda di schemi di django piuttosto semplice. Il mio codice manager di solito vive in models.py, ma cosa succede quando models.py è davvero enorme? Esiste un altro modello alternativo per far vivere il codice del gestore in models.py per la gestibilità e per evitare le importazioni circolari?Dove dovrebbe vivere il codice manager di Django?

Una domanda può essere posta sul perché models.py sia così grande, ma supponiamo che le dimensioni e l'ampiezza dell'utilità siano giustificate.

risposta

21

Preferisco mantenere i modelli in models.py e i gestori in manager.py (forms in forms.py) all'interno della stessa app. Per i gestori più generici, preferisco tenerli in core.managers se possono essere riutilizzati per altre app. In alcune delle nostre app più grandi con model/modelname.py che conterrà un gestore e il codice del modello che non sembra male.

+1

Come si gestiscono quindi in modo pulito model.py che è necessario importare managers.py e viceversa? – Jeff

+24

managers.py non dovrebbe aver bisogno di importare i modelli - il modello in questione sarà sempre disponibile come 'self.model' sul gestore. – jacobian

+5

È fantastico ... a meno che il QuerySet del tuo manager non faccia riferimento a un altro modello, quindi non puoi importarlo e DEVE inserirlo in models.py (ad es. Se stai escludendo elementi esistenti in un altro modello, ecc.). –

3

Quello che ho fatto durante la creazione di app Django è stato creare un file [modelname] .py con solo il codice modello specifico, il codice gestore e talvolta il codice modulo e utilizzato un file __init__.py da importare poi tutti nella directory dei modelli. Questo mi ha aiutato almeno a mantenerlo gestibile.

+0

Se avessi intenzione di farlo, inserirò tutti questi file in una cartella 'models'. Manterrà l'app root pulita e organizzerà meglio le importazioni. – jangeador

6

Metto sempre il mio in managers.py. Se si dispone di un problema di importazione circolare, ricordare che a) È possibile fare riferimento alla classe del modello per un gestore su self.model e b) È possibile eseguire importazioni all'interno delle funzioni.

+0

+1 per ricordarci che è possibile importare all'interno di una funzione. Nel mio caso ho dovuto usare un modello esterno per il mio manager e ho aggiunto '' apps.get_model (app_label = 'nome_app ", model_name =' nome_modello ')' 'all'interno del metodo – jangeador

7

La soluzione migliore con un ampio set di modelli consiste nell'utilizzare i moduli django a proprio vantaggio e semplicemente creare una cartella denominata modelli. Sposta la tua vecchia models.py in questa cartella di modelli e rinominala __init__.py. Ciò ti consentirà di separare ciascun modello in file più specifici all'interno di questa cartella del modello.

Dovresti quindi solo importare ogni modello nello spazio dei nomi di __init__.py.

Così, per esempio, si potrebbe desiderare di separarla in:

yourapp/ 
    models/ 
     __init__.py # This file should import anything from your other files in this directory 
     basic.py # Just an example name 
     morespecificmodels.py # Just an example name 
     managers.py # Might want to separate your manager into this 

Allora la vostra __init__.py può essere solo:

from basic import * # You should replace * with each models name, most likely. 
from managers import YourManager # Whatever your manager is called. 

Questa è la struttura che uso quando i miei file modello ottengono enorme, tuttavia cerco di separare le cose in app più collegabili il più spesso possibile - quindi questo è usato raramente da me.

Spero che questo aiuti.

Problemi correlati