2010-05-22 8 views
5

Hier sind meine schematischen Modelle:inverse Beziehung auf mehrere Vererbungsklassen in 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 

Es ist möglich und wahrscheinlich, dass in Zukunft I (oder vielleicht jemand anderes) mehr Bill Typen hinzufügen möchte.

Jeder Bill auf ein Gesetz zeigen sollte (was anzeigt, welches Recht dieses Gesetz ändern wird) und meine Frage ist: Was ist der beste Weg, dies zu realisieren ist?

Wenn ich die ForeignKey (Gesetz) zu Bill, fügen werde ich eine Beziehung von jedem Bill zum Gesetz, sondern ein Gesetz nur eine inverse Beziehung müßte Bills (bill_set) und keine verschiedene inverse Beziehung zu jeder Art von Rechnung. Natürlich kann ich jede Art von Rechnung filtern, um nur diejenigen zu erhalten, die auf ein bestimmtes Gesetz verweisen, aber das ist etwas, das ich oft verwenden muss. Ich denke also, dass privatebill_set, borgetbill_set usw. den Code machen würde lesbarer.

Eine andere mögliche Lösung besteht darin, die Fremdschlüssel zu jedem der Vererbungsklassen hinzuzufügen (das mir eine privatebill_set geben würde, governmentbill_set, futurebill_set), aber das scheint haarig, weil ich auf zukünftige Programmierer angewiesen sein würde, sich daran zu erinnern hinzufügen diese Beziehung.

Wie würden Sie das lösen?

Antwort

2

Vielleicht können Sie Ihren Bill Klasse abstrakt machen und tun es wie folgt aus:

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

Tolle Idee. Vielen Dank. –

1

Generic relations könnte der Weg sein, hier zu gehen - sie ermöglichen es Ihnen, eine Struktur zu haben, ähnlich ein ForeignKey, die an einem anderen Punkt Modell.

Verwandte Themen