2010-05-22 11 views
5

Aquí están mis modelos esquemáticos:inversa relación con múltiples clases Herencia de Django en

class Law(models.Model): 
    ... 

class Bill(models.Model): 
    ... # data for a proposed law, or change of an existing law 

class PrivateBill(Bill): 
    ... # data for a Bill that was initiated by a parliament member 

class GovernmentBill(Bill): 
    ... # data for a Bill that was initiated by the government 

Es posible y probable que en el futuro (o tal vez alguien más) me gustaría añadir más tipos de facturas.

Todo proyecto debe apuntar a una Ley (indicando qué ley este proyecto de ley va a cambiar) y mi pregunta es: Cuál es la mejor forma de implementar esto?

Si añadir el ForeignKey (Ley) a Bill, voy a tener una relación de todas las facturas a la Ley, sino una ley sólo tendría una relación inversa a Bills (bill_set), y no una diferente relación inversa con cada tipo de factura. Por supuesto, podré filtrar cada tipo de factura para obtener solo los que apuntan a una ley específica, pero esto es algo que creo que necesitaré usar a menudo, así que creo que tener privatebill_set, governmentbill_set, etc. haría que el código más legible

Otra posible solución es añadir la clave externa a cada una de las clases Herencia de (esto me daría una privatebill_set, governmentbill_set, futurebill_set), pero que parece peluda porque estaría confiando en futuros programadores para recordar añadir esa relación.

¿Cómo solucionaría esto?

Respuesta

2

Tal vez usted puede hacer su clase Bill abstracto y lo hacen de esta manera:

class Bill(models.Model): 
    law = models.ForeignKey(Law, related_name="%(app_label)s_%(class)s_related") 

    class Meta: 
     abstract = True 

class PrivateBill(Bill): 
    pass 

class GovernmentBill(Bill): 
    pass 
+0

Gran idea. Gracias. –

1

Generic relations podría ser el camino a seguir aquí - que le permiten tener una estructura similar a un ForeignKey que apunta a cualquier otro modelo.

Cuestiones relacionadas