[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