2009-05-13 17 views
37

He comenzado a trabajar en una aplicación local para mí que se ejecuta a través del navegador. Habiendo pasado recientemente por el tutorial de django, estoy pensando que sería mejor usar django en lugar de simplemente python.Aproximadamente 20 modelos en 1 aplicación django

Hay un problema: tengo al menos 20 modelos y cada uno tendrá muchas funciones. Simplemente va a crear un gran archivo de modelos y probablemente también grandes vistas. ¿Cómo los divido?

models are all related así que no puedo simplemente convertirlas en aplicaciones separadas, ¿o sí?

Respuesta

30

"Tengo por lo menos 20 modelos" - esto es probablemente más de una "aplicación" Django y es más como un "proyecto" Django con varias "aplicaciones" pequeñas

me gustaría hacer una partición cosas alrededor de temas o áreas temáticas que tienen algunos (1 a 5) modelos. Esto se convierte en una "aplicación" de Django, y es la unidad útil de reutilización.

El "proyecto" general es una colección de aplicaciones que presenta lo integrado formado por piezas separadas.

Esto también ayuda a la gestión de proyectos ya que cada "aplicación" puede convertirse en un sprint con un lanzamiento al final.

+1

Pero si los modelos tienen que relacionarse entre sí ¿cómo puedo colocarlos en aplicaciones separadas? – Teifion

+2

Un modelo puede hacer referencia fácilmente a modelos en otro paquete. Casi siempre tiene modelos de "nivel superior" y "nivel inferior". Implemente los modelos de nivel inferior en una aplicación. Las aplicaciones de nivel superior pueden depender de los modelos de la aplicación de nivel inferior. –

+13

Cada vez que configura una clave externa para el modelo de usuario en django.contrib.auth, se relaciona en distintas aplicaciones ... –

0

Puede dividir los modelos en varios archivos. Esto también se aplica a las vistas.

0

puede dividirlos en archivos separados y simplemente tener importaciones en la parte superior de su principal models.py campo.

Si desea realmente quiere a es otra pregunta.

+0

Como dijo Jarret Hardie, crear un paquete python (es decir, un directorio con un archivo __init__.py) llamado modelos sería la mejor manera de hacerlo. –

69

Esta es una necesidad muy común ... no puedo imaginar vadear a través de un archivo que es models.py 10.000 líneas de largo :-)

Puede dividir el archivo models.py (y views.py también) en un pacakge. En este caso, el árbol del proyecto se verá así:

/my_proj 
    /myapp 
     /models 
      __init__.py 
      person.py 

El archivo __init__.py hace que la carpeta en un paquete. El gotcha es para asegurarse de definir una clase interna Meta para sus modelos que indican la app_label para el modelo, de lo contrario Django tendrá problemas para la construcción de su esquema:

class Person(models.Model): 
    name = models.CharField(max_length=128) 

    class Meta: 
     app_label = 'myapp' 

Una vez hecho esto, importar el modelo en su __init__.py archivo para que Django y db sincronización encontrarán:

from person import Person 

De esta manera usted puede todavía hacer from myapp.models import Person

+0

Teóricamente funciona, pero ejecutar la línea del tutorial "python manage.py sql gui" no hace nada, ¿alguna idea de qué se trata? – Teifion

+1

Eso generalmente significa que django no puede encontrar los modelos. Asegúrese de tener las importaciones en su archivo models.__init__.py y de haber configurado la etiqueta app_label para cada modelo. También asegúrate de eliminar el antiguo archivo models.py. –

+11

Esto es técnicamente correcto, pero _almost_ downvote digno ya que es una mala idea en la práctica. Si tiene suficientes modelos para pensar en dividir su models.py, debe dividir en varias aplicaciones. –

16

Los modelos son todo relacionado así que no puedo simplemente hacerlos en aplicaciones separadas ¿puedo?

Usted puede separarlos en aplicaciones separadas. Para usar un modelo en una aplicación desde otra aplicación, solo debe importarlo de la misma manera que importaría las aplicaciones django.contrib.

+14

+1. No hay ninguna ley en contra de las aplicaciones que dependen de cada uno. – muhuk

5

Tener 20 modelos en una aplicación podría ser una señal de que debe dividirla en otras más pequeñas.

El propósito de una aplicación de Django es tener una pequeña porción de código único, que se ajuste a nicelly.

Por lo tanto, si tiene un sitio de comercio electrónico, es posible que tenga una aplicación shopping_cart, una aplicación de facturación, etc.

Tenga en cuenta que realmente no hay ningún problema en las aplicaciones que dependen unas de otras (aunque siempre es mejor si se pueden desacoplar), pero no debería tener una aplicación haciendo dos cosas muy distintas.

El artículo Django tips: laying out an application puede ayudarle. Como siempre, tome todo lo que lea con un grano de sal (incluida esta respuesta).