2010-05-22 14 views
5

Qui ci sono i miei modelli schematici:inversa rispetto a più classi che ereditano 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 

E 'possibile e probabile che in futuro mi (o forse qualcun altro) vorrei aggiungere più tipi di Bill.

Ogni Bill deve puntare a una legge (indicando quale legge questo disegno di legge sta per cambiare) e la mia domanda è: Qual è il modo migliore per attuare questo?

Se aggiungo il ForeignKey (legge) a Bill, avrò una relazione da ogni Bill alla legge, ma una legge avrebbe solo una relazione inversa a Bills (bill_set), e non un diversa relazione inversa a ciascun tipo di fattura. Naturalmente sarò in grado di filtrare ogni tipo di fattura per ottenere solo quelli che puntano a una specifica Legge, ma è qualcosa che penso avrò bisogno di usare spesso, quindi penso che avere privatebill_set, governmentbill_set etc renderebbe il codice più leggibile.

Un'altra possibile soluzione è quella di aggiungere la chiave esterna a ciascuna delle classi che ereditano (questo mi avrebbe dato un privatebill_set, governmentbill_set, futurebill_set), ma che sembra peloso perché sarei basandosi su futuri programmatori di ricordare di aggiungere quella relazione.

Come lo risolveresti?

risposta

2

Forse si può rendere la vostra classe Bill astratta e fare in questo modo:

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

Ottima idea. Grazie. –

1

Generic relations potrebbe essere il modo di andare qui - che consentono di avere una struttura simile a un ForeignKey che punta in qualsiasi altra modello.

Problemi correlati