2010-05-22 5 views
5

Voici mes modèles schématiques:relation inverse aux classes multiples inheriting dans django

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 

Il est possible et probable que, dans l'avenir, je (ou peut-être quelqu'un d'autre) ne voudrais ajouter d'autres types de projet de loi.

Chaque projet de loi doit pointer vers une loi (indiquant quelle loi ce projet de loi va changer) et ma question est la suivante: Quelle est la meilleure façon de mettre en œuvre ce?

Si je ajouter le ForeignKey (loi) pour le projet de loi, je vais avoir une relation de chaque projet de loi à la loi, mais une loi n'aurais une relation inverse aux projets de loi (de bill_set), et non une relation inverse différente à chaque type de facture. Bien sûr, je serai capable de filtrer chaque type de facture pour obtenir seulement celles qui pointent vers une loi spécifique, mais c'est quelque chose que je pense devoir utiliser souvent, donc je pense que privatebill_set, governmentbill_set etc ferait le code plus lisible.

Une autre solution possible est d'ajouter la clé étrangère à chacune des classes de inheriting (cela me donnerait un privatebill_set, governmentbill_set, futurebill_set), mais qui semble poilu parce que je serais compter sur les programmeurs futurs de se rappeler d'ajouter cette relation.

Comment voulez-vous résoudre ce problème?

Répondre

2

Peut-être que vous pouvez faire de votre classe de Bill abstrait et le faire comme ceci:

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

Bonne idée. Merci. –

1

Generic relations peut-être la voie à suivre ici - ils vous permettent d'avoir une structure similaire à un ForeignKey qui pointe à tout autre modèle.

Questions connexes