[pyar] Django, Model Inheritance en la práctica
Federico Heinz
fheinz en vialibre.org.ar
Lun Ago 2 17:55:02 ART 2010
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...
Fede
More information about the pyar
mailing list