[pyar] [Django] Herencia en modelos y consultas sobre el modelo

Dario Ocles dario.ocles en gmail.com
Vie Nov 2 00:23:54 ART 2012


El día 1 de noviembre de 2012 18:10, Santiago Basulto
<santiago.basulto en gmail.com> escribió:
> Esto es un problema muy común en Orientación a Objetos. Yo soy nuevo en
> Python, pero lo he visto en lenguajes similares. El problema es que Python
> usa lo que se conoce como Duck Typing: "Si camina como un pato, nada como un
> pato, y hace "cuak" como un pato, lo más probable es que sea un pato".
>
> Es decir, no hay que calentarse por lo que realmente "es" el objeto sino por
> las cosas que "puede hacer". Esto se confunde mucho con lenguajes que se
> basan mucho en la identidad de los objetos. En Java por ejemplo eso es muy
> común, el clásico "instanceof".
>
> La diferencia de esto es que en vez de chequear un objeto por "lo que es",
> deberías fijarte si "puede hacer" lo que vos querés. Un ejemplo, suponete
> que te llegan una lista de animales y vos querés hacerlos nadar. Tenés dos
> formas, la primera se fija si es un pato:
>
> for a in animales:
>     if isinstance(a, Pato):
>         a.nadar()
>
> la segunda no le importa qué es el objeto, sino que pueda nadar.
>
> for a in animales:
>     if hasattr(a, 'nadar'):
>         a.nadar()
>
> Volviendo a tu ejemplo, seguramente vos querrás hacer algo en particular con
> esos hijos o hijas cuando haces el queryset. Lo que tenés que fijarte es que
> ese hijo o hija tenga el atributo/método que querés. No importa qué es.
> Ahora bien, si en ese caso tenés problemas, efectivamente no estás modelando
> de forma correcta el problema y lo mejor sea lo que dijo Roberto, utilizar
> relaciones.
>

Con lo que vos decís sigo teniendo el problema inicial.

En mi ejemplo tengo a un modelo que extiende de Padre llamada Hijo que
tiene una propiedad "edad". Si yo agarro cualquier objeto que me
devuelve una busqueda de Padre y le pregunto si tiene edad, no la
tiene, aunque este seguro de que ese objeto es un Hijo.

>>> p = Padre.objects.get(nombre='dario')
>>> print p.hijo.edad
20

Tengo esa forma HORRIBLE de acceder a la edad teniendo que saber de
que es un Hijo o cualquier otro objeto que extienda de Padre.


Entiendo que el ejemplo que di no es el mejor, era solo para ilustrar.
En realidad no es realmente necesario que use herencia en el modelo
pero al cruzarme con esto me pareció básico y hasta normal esperar que
me instancie el objeto correcto.

En otros lenguajes con otros frameworks la clase Padre seria abstracta
y podría hacer consultas sobre ésta... pero en Django si la hago
abstracta no puedo hacer consulta sobre el modelo Padre y termina
siendo peor solución.

Saludos y gracias.



More information about the pyar mailing list