python django design-patterns django-models django-managers

python - ¿Dónde debería estar el código del administrador de django?



design-patterns django-models (4)

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?

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


Lo que hice al crear aplicaciones de Django fue crear un archivo [modelname] .py con solo el código del modelo específico, el código del administrador y, a 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.


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.


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.


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

Entonces, solo necesitarás importar cada modelo en el espacio de nombre de tu __init__.py .

Entonces, por ejemplo, es posible que desee 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

Entonces tu __init__.py solo puede ser:

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 uso cuando los archivos de mi modelo se vuelven enormes, sin embargo, trato de separar cosas en más aplicaciones conectables con la mayor frecuencia posible, por lo que rara vez lo uso.

Espero que esto ayude.