2009-12-10 11 views
20

Esta es una pregunta de patrones de django bastante simple. Mi código de administrador generalmente vive en models.py, pero ¿qué sucede cuando models.py es realmente enorme? ¿Hay algún otro patrón alternativo para permitir que su código de administrador viva en models.py para la mantenibilidad y para evitar importaciones circulares?¿Dónde debería estar el código del administrador de django?

Se puede preguntar por qué models.py es tan grande, pero supongamos que su tamaño y amplitud de utilidad están justificados.

Respuesta

21

Prefiero mantener mis modelos en models.py y gerentes en managers.py (formularios en forms.py) todos dentro de la misma aplicación. Para gerentes más genéricos, prefiero mantenerlos en core.managers si pueden ser reutilizados para otras aplicaciones. En algunas de nuestras aplicaciones más grandes con modelos/modelname.py que contendrá un administrador y el código del modelo que no parece malo.

+1

¿Cómo se maneja limpiamente con models.py que necesita importar managers.py y viceversa? – Jeff

+24

managers.py no debería necesitar importar modelos: el modelo en cuestión siempre estará disponible como 'self.model' en el administrador. – jacobian

+5

Eso es genial ... a menos que QuerySet de su gerente necesite hacer referencia a otro modelo, entonces no puede importarlo, y DEBE ponerlo en models.py (por ejemplo, si excluye elementos que existen en otro modelo, etc.). –

3

Lo que hice al crear aplicaciones Django fue crear un archivo [modelo] .py con solo el código del modelo específico, el código del administrador y algunas veces el código del formulario y usé un archivo __init__.py para importar todo en el directorio de modelos. Esto me ayudó al menos para mantenerlo manejable.

+0

Si fuera a hacer esto, pondría todos estos archivos dentro de una carpeta 'models'. Mantendrá limpia la raíz de la aplicación y organizará mejor las importaciones. – jangeador

6

Siempre coloco el mío en managers.py. Si tiene un problema de importación circular, recuerde que a) Puede hacer referencia a la clase de modelo de un administrador en self.model, yb) Puede hacer importaciones dentro de las funciones.

+0

+1 para recordarnos que puede importar dentro de una función. En mi caso, tuve que usar un modelo externo para mi administrador y agregué '' apps.get_model (app_label = 'app_name', model_name = 'model_name') '' dentro del método – jangeador

7

Su mejor opción con un gran conjunto de modelos es utilizar los módulos django a su favor, y simplemente cree una carpeta llamada modelos. Mueva su antiguo models.py a esta carpeta de modelos y cámbiele el nombre __init__.py. Esto le permitirá luego separar cada modelo en archivos más específicos dentro de esta carpeta modelo.

Solo necesitaría importar cada modelo en el espacio de nombre __init__.py.

Así, por ejemplo, es posible que desee para separarlo en:

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 

Luego, su __init__.py puede ser simplemente:

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

Esta es la estructura que utilizo cuando mis archivos de modelos consiguen enorme, sin embargo, trato de separar las cosas en más aplicaciones conectables con la mayor frecuencia posible, por lo que rara vez las uso.

Espero que esto ayude.

Cuestiones relacionadas