2011-05-11 11 views
12

Soy algo así como un principiante de Django y he estado tratando de desacoplar mis aplicaciones tanto como sea posible y construirlo en piezas reutilizables como sea posible. Tratando de seguir la estrategia de James Bennett de construir re-usable apps. Con eso en mente, me encontré con este problema.¿Cómo crear aplicaciones Django reutilizables?

Digamos que tenía una aplicación que almacena información sobre las películas:

El código sería algo como esto:

class Movie(models.Model): 
    name = models.CharField(max_length=255) 
    ... 

Ahora, si quisiera añadir notas, que podría utilizar Django-calificación y simplemente agregar un campo a mi modelo:

class Movie(models.Model): 
    name = models.CharField(max_length=255) 
    rating = RatingField(range=5) 
    ... 

Esto significa que mi inherentemente la aplicación de película depende ahora de Django calificaciones y si quería volver a usarlo, pero ya no necesitaba calificaciones, Todavía tendría que instalar django-ratings o modificar y desviar mi aplicación.

Ahora, podría solucionar esto con try/except con importación y definir el campo si tiene éxito, pero ahora mi aplicación de película está explícitamente ligada a la clasificación en la definición de la tabla de la base de datos.

Parece mucho más sensato separar los dos modelos y definir la relación en el modelo de evaluación en lugar de la película. De esa forma, la dependencia se define cuando uso la calificación, pero no es necesaria cuando uso la aplicación Movie.

¿Cómo lidiar con este problema? ¿Hay un mejor enfoque para separar los modelos?

También me pregunto si hay alguna penalización de rendimiento importante al hacer esto.

editar: Quiero aclarar que este es más un ejemplo del problema y un tanto artificial para ilustrar un punto. Quiero poder agregar información adicional sin modificar el modelo de "Película" cada vez que necesito agregar datos relacionados. Aprecio las respuestas hasta ahora.

+3

Me encantan todas tus películas, amigo. – zeekay

Respuesta

4

En este caso, personalmente, lo mantendría simple y dejo rating en el modelo. Debe equilibrar la reutilización con la simplicidad de la implementación. Es genial hacer las cosas reutilizables, pero ¿es tu modelo Movie realmente útil para garantizar el trabajo extra? ¿Y es tan malo tener una dependencia? Creo que gran parte de estas decisiones de diseño son subjetivas. Hubo una buena charla este año en PyCon sobre este tema: http://blip.tv/file/4882961

1

En primer lugar, estoy de acuerdo con Zeekay anterior, debe introspectar si esa cantidad de reutilización vale la pena, para su modelo.

Si la verdad está, se puede crear un nuevo movierating aplicación que tiene un RatingModel que tiene FK movies.models.Movie y el campo rating.

Nunca pasará el ratingde alguna manera a las plantillas. Para eso, puede crear class-based-views y en el movierating.views puede extender y anular el método get_context.

No se olvide lograr la reutilización es un juicio de valor fundamentalque un desarrollador tiene que hacer y sobre-haciendo que podría ser tan malo como el no hacerlo en el primer lugar.

0

Tener dependencias no es necesariamente algo malo. Para algo como un campo (rating, timedelta, objeto JSON), donde no hay campo incorporado que haga lo que necesita, tener que incluir una aplicación separada que maneje eso (y tal vez alguna funcionalidad relacionada, como etiquetas de plantilla) es una característica, no es un error.

Más un problema es cuando los modelos de sus aplicaciones hacen referencia a los modelos de otras aplicaciones. Por supuesto, esto sucede en el mundo real, pero en ese caso, hace que sea mucho más difícil identificar modelos aislados.

Cuestiones relacionadas