[pyar] Django, Model Inheritance en la práctica
Tomas Zulberti
tzulberti en gmail.com
Lun Ago 2 18:02:34 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. La herencia de modelos
> viene muy bien porque permite hacer cosas como esta:
>
> class PaymentMethod(models.Model):
> customer = models.ForeignKey(Customer)
> [...]
>
> class CBUDebit(PaymentMethod):
> bank = models.ForeignKey(Bank)
> cbu = models.CharField(max_length=21)
> [...]
>
> class CCDebit(PaymentMethod):
> cc_operator = models.ForeignKey(CrediCard)
> cc_number = models.CharField(max_length=16)
> expiration_date = models.CharField(max_length=6)
> [...]
>
> class Sale(models.Model):
> customer = ForeignKey(Customer)
> payment_method = ForeignKey(PaymentMethod)
> [...]
>
> Lo bueno es que puedo armar las cosas de modo que se puedan ingresar
> todos los medios del pago del usuario, y si `c` es una instancia de
> Customer, entonces con `c.payment_method_set.all()` puedo obtener
> todos los métodos de pago de un cliente.
>
> Lo que no termino de enganchar es: yo podría hacer algo estilo:
>
> sale = Sale()
> sale.payment_method = c.payment_method_set.all()[0]
>
> 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...
>
Podes usar esto:
http://djangosnippets.org/snippets/1034/
Saludos,
TZ
More information about the pyar
mailing list