[pyar] Django, Model Inheritance en la práctica

Daniel Moisset dmoisset en machinalis.com
Mar Ago 3 09:21:51 ART 2010


2010/8/2 Federico Heinz <fheinz en vialibre.org.ar>:
> Estuve viendo que Django soporta herencia en los Models, lo que me
> viene espectacular para una app que estoy haciendo como ejercicio:
> un sistema para hacer débitos automáticos. (...)
> y con eso tengo armada la cosa para cobrarlo... en principio. Porque
> ahora `sale.payment_method` es una instancia de `PaymentMethod`, no
> de la clase "que corresponde". Si sé que se trata de una tarjeta de
> crédito, puedo acceder al objeto "completo" con
> `sale.payment_method.ccdebit`, pero en realidad, si sólo tengo
> `sale.payment_method` *no sé* si es `CBUDebit` o `CCDebit`, y no
> encuentro ninguna manera sencilla de determinarlo.
>
> Se me ocurren algunas maneras medio estrambóticas de resolverlo,
> almacenando en las instancias de `PaymentMethod` algún distintivo de
> la subclase, por ejemplo el nombre del atributo que lleva a la otra
> tabla, cosa de usarlo en con `getattr()`, pero pensé que en una de
> esas ya alguien tropezó con este use case y tiene una solución que
> es el aujero'el mate...

Esto que decis pasa, y es bastante... sucky. Estaría bueno que hubiera
una forma de resolverlo y no la hay, mas que las cosas que te dijeron
(ir preguntando por los distintos tipos de hijos, y capturar
excepciones, o ponerle el content_type a la clase padre)

Tiene una razón de ser todo esto, si te fijas en el modelo relacional
de atras, que no logra capturar del todo el polimorfismo de tu modelo.
O sea, no hay una forma directa de obtener el objeto del tipo correcto
por que en la DB no tenes forma de obtener el objeto del tipo correcto
sin hacer una consulta por subtipo. Este es uno de los lugares donde
tenes una leaky abstraction, y la transparencia de "no, no es una DB
relacional, son todos objetos" se hace medio turbia.

Es un patron de uso comun y debería venir aguna solucion en django,
pero no hay. Se puede hacer algo con content types (que es
esencialmente agregar un campo a la tabla padre diciendo de cual de
todas las variantes es la instancia, si queres te doy un ejemplito de
eso mas tarde

Saludos,
   D.



More information about the pyar mailing list