Domanda

Esiste un supporto esplicito per l'ereditarietà di una singola tabella in Django? L'ultima volta che ho sentito, il film era ancora in fase di sviluppo e dibattito.

Ci sono librerie / hack che posso usare nel frattempo per catturare il comportamento di base? Ho una gerarchia che mescola oggetti diversi. L'esempio canonico di una struttura societaria con una classe Employee, sottoclassi per tipi di dipendenti e manager_id (parent_id) sarebbe una buona approssimazione del problema che sto risolvendo.

Nel mio caso, vorrei rappresentare l'idea che un dipendente possa gestire altri dipendenti mentre è gestito da un altro dipendente. Non ci sono classi separate per Manager e Worker, il che rende difficile la diffusione su più tabelle. Le sottoclassi rappresenterebbero tipi di impiegati-programmatori, ragionieri, vendite, ecc. E sarebbero indipendenti da chi supervisiona chi (OK, suppongo che non sia più una tipica azienda per certi aspetti).

È stato utile?

Soluzione

Attualmente ci sono due forme di ereditarietà in Django: MTI (ereditarietà delle tabelle modello) e ABC (classi di base astratte).

Ho scritto un tutorial su cosa sta succedendo sotto il cofano.

Puoi anche fare riferimento ai documenti ufficiali su ereditarietà del modello .

Altri suggerimenti

Penso che l'OP stia chiedendo l'ereditarietà a tabella singola come definito qui :

  

I database relazionali non supportano l'ereditarietà, quindi quando mappiamo da oggetti a database dobbiamo considerare come rappresentare le nostre belle strutture ereditarie in tabelle relazionali. Quando si esegue il mapping a un database relazionale, si cerca di ridurre al minimo i join che possono essere montati rapidamente durante l'elaborazione di una struttura di ereditarietà in più tabelle. L'ereditarietà di una singola tabella associa tutti i campi di tutte le classi di una struttura di ereditarietà in un'unica tabella.

Cioè, una singola tabella di database per un'intera gerarchia di classi di entità. Django non supporta questo tipo di eredità.

Vedi il mio tentativo:

http://djangosnippets.org/snippets/2408/

  

Un'emulazione di " tabella per gerarchia " a.k.a. "ereditarietà a tabella singola" a Django. La classe base deve contenere tutti i campi. Le sue sottoclassi non possono contenere campi aggiuntivi e in modo ottimale dovrebbero essere proxy.

Non esattamente " ereditarietà a tabella singola " ma abbastanza vicino per molte situazioni.

Penso che tu possa fare qualcosa di simile a questo.

Devo implementare una soluzione per questo problema da solo, ed ecco come l'ho risolto:

class Citrus(models.Model)
    how_acidic = models.PositiveIntegerField(max_value=100)
    skin_color = models.CharField()
    type = models.CharField()

class TangeloManager(models.Manager)
    def get_query_set(self):
        return super(TangeloManager, self).get_query_set().filter(type='Tangelo')

class Tangelo(models.Model)
    how_acidic = models.PositiveIntegerField(max_value=100)
    skin_color = models.CharField()
    type = models.CharField()
    objects = TangeloManager()
    class Meta:
        # 'appname' below is going to vary with the name of your app
        db_table = u'appname_citrus'

Questo potrebbe avere alcuni problemi di blocco ... Non sono davvero sicuro di come Django lo gestisca dalla parte superiore della mia testa. Inoltre, non ho davvero testato il codice sopra, è strettamente a scopo di intrattenimento, spero di metterti sulla strada giusta.

questo potrebbe essere utile: https://github.com/craigds/django-typed- modelli Sembra essere in qualche modo un'implementazione dell'ereditarietà a tabella singola ma ha il limite che le sottoclassi non possono avere campi extra.

esiste anche un fork che risolve il problema di non poter creare campi aggiuntivi: https://github.com/KrzysiekJ/django-typed-models

aggiornamento: credo che il fork potrebbe essere stato ricollocato in

ecco una recente discussione sulla mailing list degli sviluppatori di django su STI: https://groups.google.com/forum/#! msg / django-sviluppatori / -UOM8HNUnxg / 6k34kopzerEJ

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top