[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