[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