Foros del Web » Programando para Internet » Python »

Llamar metodo de models en views

Estas en el tema de Llamar metodo de models en views en el foro de Python en Foros del Web. Buenas tardes, mi duda es la siguiente. En models tengo los siguientes campos definidos @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código Python: Ver original class ProductoAlmacen ( Modelo ) ...
  #1 (permalink)  
Antiguo 29/08/2014, 13:12
 
Fecha de Ingreso: febrero-2014
Ubicación: Hermosillo, Sonora
Mensajes: 86
Antigüedad: 10 años, 10 meses
Puntos: 0
Llamar metodo de models en views

Buenas tardes, mi duda es la siguiente. En models tengo los siguientes campos definidos

Código Python:
Ver original
  1. class ProductoAlmacen(Modelo):
  2.     precio_venta = models.DecimalField(decimal_places=2, max_digits=12, default=0)
  3.     existencia = models.DecimalField(decimal_places=2, max_digits=12, default=0)
  4.     valor_inv = models.DecimalField(decimal_places=4, max_digits=12, default=0)

Lo que hice fue crear un metodo para poder asignarle un valor a valor_inv. de la siguiente manera


Código Python:
Ver original
  1. def set_valor_inv(self):
  2.         self.valor_inv = self.existencia * self.precio_venta
  3.         self.save()

La duda que tengo es como puedo llamar este metodo en views, ya que utilizo una variable productos la cual esta igualada a ProductoAlmacen, con la cual traigo todos los campos. Pero si esto lo pongo en el template. En valor_inv me impirme 0, ya que es el default. Si alguien sabe como puedo llamar el metodo set_valor_inv en el views

Última edición por razpeitia; 29/08/2014 a las 21:00
  #2 (permalink)  
Antiguo 29/08/2014, 21:26
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 9 meses
Puntos: 1360
Respuesta: Llamar metodo de models en views

Si puedes llamar al método set_valor_inv dentro del template. Pero sinceramente no lo haría.

Primero vamos a revisar tu método.
Código Python:
Ver original
  1. def set_valor_inv(self):
  2.         self.valor_inv = self.existencia * self.precio_venta
  3.         self.save()
Primero calculas y asignas a valor_inv, excelente hasta aquí todo bien. De hecho aqui deberia de terminar el método, pero después guardas, eso significa hacer un query a la base de datos para guardar y segundo le estas asignando funcionalidad extra que no debería de ir ahí.

Hay un montón de maneras de hacer esto:
Primer manera:
Hacer un override del método save en tu modelo para que calcule el campo valor_inv antes de guardarlo.

Este comportamiento seria global y no abría forma de alterar valor_inv sin ir directo a la base de datos o cambiar los valores de existencia o precio_venta. Incluso en el admin este comportamiento seguiría igual.

Segunda manera:
Hacer un override del método save en cada uno de los formularios que vaya a modificar una instancia de tu modelo.

Lo malo es que lo vas a tener que reescribir eso por un montón de partes o crear algún mixin o hacer algo por el estilo. Pero tal vez haya formularios donde quieras modificar valor_inv con algún valor que tu le des. Incluso tendrías que añadir esto para el admin.

Tercera manera:
Usar signals, básicamente sería lo mismo que la segunda manera pero con signals en lugar de hacer el override.

Cuarta manera:
Tal vez el campo no te interesa tenerlo guardado, ya que siempre lo puedes calcular a través de existencia y precio_venta, no necesitas filtrar por ese campo, ordenar por ese campo. Solo te interesa mostrarlo y ya. En ese caso es mejor un campo calculado. Solo defines tu método y lo muestras en la plantilla.

Código Python:
Ver original
  1. @property
  2. def valor_inv(self):
  3.     return self.existencia * self.precio_venta

Quita manera:
Crear un middleware, que al pasar por el process_response, analice el response y veo si necesita efectuar algún cambio en las instancias que creaste.

En fin existen un montón de soluciones, cada de ellas con sus pros y sus contras.

Etiquetas: django
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:45.