2011-09-18 11 views
5

Es un problema de diseño.¿Qué tipo de métodos debería ser el método de la clase modelo?

Asumamos que tenemos este tipo de modelo de Django:

class Payment(models.Model): 
    purchase = ForeignKeyField(Purchase) 
    net_price = DecimalField() 
    is_accepted = BooleanField() 

    def set_accept(self): 
    # there will be some logic, which touch purchase, send emails etc. 

    def price_with_tax(self): 
    return net_price * (1. + TAX) 

Tenemos también otro archivo llamado actions.py y aplicar allí acciones de los demás. Nuestro problema es determinar qué tipo de métodos se deben colocar en models.py, que en actions.py. ¿Conoces algún enfoque común, guía o algo así? Quiero usar las soluciones existentes tanto como sea posible.

Gracias

Respuesta

6

La convención general en marcos MVC (como Django) es colocar tanto la lógica como sea posible en los modelos. Esto sirve para muchos propósitos:

  • Vincula su lógica a sus datos (bueno).
  • Hace que sea más fácil mirar a un lugar en el código para todos los métodos de manipulación de datos.
  • Permite ejecutar los métodos en sus modelos directamente sin depender de puntos de vista (hace que las pruebas más simple).
  • le da una API muy 'limpia' para utilizar en tus plantillas, por ejemplo: {{ object.price_with_tax }}, en contraposición a la representación de diferentes puntos de vista diferentes comportamientos.

Para el diseño del proyecto, usted debe tratar de mantener ningún tipo de código que funciona en los modelos en su archivo models.py, y tratar de evitar el uso de un actions.py o helpers.py a menos que realmente lo necesite. Si tiene cantidades grandes de código que no son apropiadas para poner en su models.py (tal vez está implementando algoritmos o algo así), la convención es usar un helpers.py.

Hay muchas más cosas que puede hacer más adelante para mantener la jerarquía de su aplicación limpia y organizada, pero esa es la esencia básica de todo.

0

La forma estándar en django es poner el código que funciona en la fila de la tabla directamente en el modelo, y el código que funciona con varias filas, o en una tabla, en un administrador.

class MyManager(models.Manager): 
    def do_something_with_some_rows(self): 
     query = self.filter(...) 
     result = do_someting_with_this_query(query) 
     return result 

class MyModel(models.Model): 
    objects = MyManager() 

a continuación, puede utilizar este gestor de esta manera

>>> result = MyModel.objects.do_something_with_some_rows() 

como dijeron rdegges, esto hace que su API mucho más limpio y más fácil de usar, y también es mucho más fácil de probar.

https://docs.djangoproject.com/en/dev/topics/db/managers/#managers

Cuestiones relacionadas