[pyar] Método en Modelo Django

Daniel Moisset dmoisset en machinalis.com
Mar Ago 9 10:19:24 ART 2011


2011/8/8 matias benedetto <matias.benedetto en gmail.com>
>
> Hola,
> estoy teniendo este problema y no me doy cuenta como resolverlo.
> Quiero poner un metodo en un campo de un modelo , pero me da errores los modelos son estos (resumidos):

A ver, vi varios emails en el hilo pero nadie se esta fijando en el
problema concreto que tenes

Por empezar, tu problem no tiene nada que ver con Django, te va a
pasar en cualquier clase de python

o sea, si tenes

class Producto(object): # no soy un modelo de django!
    ....
    def obtener_imagen(self):
        return self.blabla
    ....
    imagen = obtener_imagen(self)

vas a tener el mismo problema. Dejme contartelo en el ejemplo ese asi
lo que sea de django no te mete ruido

fijate que "obtener imagen" es un *metodo*, con lo cual para aplicarlo
necesitas la instancia. o sea si tenes:

  caja_de_ravioles = Producto()
  lata_de_sardinas = Producto()

vos despues podes hacer

  print caja_de_ravioles.obtener_imagen()
  print lata_de_sardinas.obtener_imagen()

y eso pasa caja_de_ravioles como argumento "self" al hacer la primer
llamada, y lata_de_sardinas en la segunda. fijate que *no* se pone
nada entre los parentesis. O sea, tu primer error conceptual es:

 * Los metodos se llaman con  objeto.metodo(argumentos SIN el self).
(Vos en vez estas llamando "metodo(objeto)"

Arreglando esto vos diras "ah, entonces pongo:

class Producto(object): # no soy un modelo de django!
    ....
    def obtener_imagen(self):
        return self.blabla
    ....
    imagen = self.obtener_imagen() # Notacion correcta para llamada a metodo

"

Esto tampoco te va andar porque hay otro error conceptual ahi: la
linea "image = ..." esta definida dentro de la clase. Dentro de la
clase, todavia no estas hablando de una instancia en particular sino
de la generalidad de los productos. Para llamar a obtener_imagen
necesitas un producto creado, pero en vez estas definiendo un atributo
*de la clase* (o sea, igual para todos los productos), con lo cual
tampoco tiene mucho sentido; que imagen va a ser "imagen" (que es una
en todo el sistema) la caja de ravioles? o la lata de sardinas?.

O sea fijate que, con esa clase de arriba, sin importr que haya en los
puntitos suspensivos[1] yo *sé* que

  print caja_de_ravioles.imagen
  print lata_de_sardinas.imagen
  print Productos.imagen

van a mostrar lo mismo

Entonces aca hay dos problemas conceptuales mas que tenes:

 * referirte a self solo tiene sentido en un metodo, que esta asociado
a una instancia (la que se paso detras del punto antes de llamar al
metodo)
 * algunas cosas se definen a nivel instancia, y otras a nivel clase.
Las definiciones a nivel clase se hacen una vez para todas las
instancias

para que tenga sentido hablar de self, necesitas si o si un método. por ejemplo

class Producto(object):
    ....
    def obtener_imagen(self):
        return self.blabla
    ....
    def imagen(self): # Definimos un metodo, asi esto se da para cada instancia
        return self.obtener_imagen() # Notacion correcta para llamada a metodo

y ahora podes hacer:

  print caja_de_ravioles.imagen()
  print lata_de_sardinas.imagen()

Me imagino que vos hiciste asi porque no querias que se viera como una
llamada arriba. Ahi es donde podes meter las properties, que te
permiten llamar a un metodo de instancia y que en realidad parezca un
atributo de la instancia:

class Producto(object):
    ....
    def obtener_imagen(self):
        return self.blabla
    ....
    @property
    def imagen(self): # Definimos un metodo, asi esto se da para cada instancia
        return self.obtener_imagen() # Notacion correcta para llamada a metodo

Con lo cual podes hacer:

  print caja_de_ravioles.imagen
  print lata_de_sardinas.imagen

que es lo que querias

Una vez que tengas el metodo, te sugioer que en su implementacion
sigas el consejo de Alejandro Peralta, que es bueno :) [ahi si propio
de Django]

Saludos,
   D.



More information about the pyar mailing list