2008-10-27 16 views
19

Czy istnieje wyraźna pomoc dla dziedziczenia pojedynczej tabeli w Django? Ostatnio słyszałem, że ta funkcja wciąż była w fazie rozwoju i debaty.Dziedziczenie pojedynczego stołu w Django

Czy mogę użyć bibliotek/hacków, aby uchwycić podstawowe zachowanie? Mam hierarchię, która łączy różne obiekty. Przykład kanoniczny struktury korporacyjnej z klasą pracowników, podklasami dla typów pracowników i menedżerem id (parent_id) byłby dobrym przybliżeniem problemu, który rozwiązuję.

W moim przypadku chciałbym przedstawić pomysł, że pracownik może zarządzać innymi pracownikami, podczas gdy jest zarządzany przez innego pracownika. Nie ma osobnych klas dla Menedżera i Pracownika, co sprawia, że ​​trudno jest rozłożyć je na różne tabele. Podklasy będą reprezentować typy pracowników - programistów, księgowych, sprzedaży itp. I będą niezależne od tego, kto nadzoruje, kto (OK, chyba pod pewnymi względami nie jest już typową korporacją).

+0

można użyć pakietu osobę trzecią, która daje pojedynczej tabeli dziedziczenia: https://github.com/craigds/django-typed-models – guettli

Odpowiedz

15

Obecnie istnieją dwie formy dziedziczenia w Django - MTI (dziedziczenie tabeli modelu) i ABC (abstrakcyjne klasy bazowe).

Napisałem tutorial o tym, co dzieje się pod maską.

Możesz także odwołać się do oficjalnych dokumentów na temat model inheritance.

15

myślę OP prosi o single-table dziedziczenia defined here:

Relacyjne bazy danych nie obsługuje dziedziczenia, więc podczas mapowania z obiektów do bazy danych musimy zastanowić się, jak przedstawiają nasze ładne struktury dziedziczenia w tabelach relacyjnych. Podczas mapowania do relacyjnej bazy danych, staramy się minimalizować połączenia, które mogą szybko zostać zamontowane podczas przetwarzania struktury dziedziczenia w wielu tabelach. Dziedzina pojedynczej tabeli odwzorowuje wszystkie pola wszystkich klas struktury dziedziczenia na pojedynczą tabelę.

To jest pojedyncza tabela bazy danych dla całej hierarchii klas jednostek. Django nie obsługuje tego rodzaju dziedziczenia.

+0

wystarczy użyć jednej tabeli, co jest niemożliwe w django? – eugene

+0

używanie jednej tabeli dla wielu modeli - to nie jest obsługiwane –

+0

@eugene Dziedziczenie pojedynczego zbioru jest jednym z kilku sposobów na uzyskanie dziedzictwa w relacyjnej bazie danych. I myślę, że jest lepszy niż te dwa sposoby, które są obsługiwane w django w tej chwili. – guettli

1

Myślę, że możesz zrobić coś podobnego do tego.

muszę wdrożyć rozwiązanie tego problemu sobie, a tu było jak I rozwiązać go:

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' 

Może to mieć pewne problemy blokujące ... Nie jestem pewien, jak Django uchwyty że off czubek mojej głowy. Ponadto, nie przetestowałem powyższego kodu, wyłącznie w celach rozrywkowych, aby, mam nadzieję, postawić cię na dobrej drodze.

+0

ciekawy pomysł ... ale myślę, że syncdb podniosłby błąd taki jak "table appname_citrus już istnieje", ponieważ próbowałby stworzyć tabelę appname_citrus po tym, jak została już stworzona przez klasę Citrus. Nie próbowałem jednak. Jeśli to zadziałało, wyobrażam sobie, że możesz użyć abstrakcyjnej klasy bazowej, aby uniknąć konieczności ponownego wpisywania nazw pól. –

3

Zobacz moją próbę:

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

emulację "tabela za hierarchii" a.k.a. "pojedynczej tabeli dziedziczenia" w Django. Klasa podstawowa musi zawierać wszystkie pola. Jego podklasy nie mogą zawierać żadnych dodatkowych pól i optymalnie powinny być serwerami proxy.

Niezupełnie "dziedziczenie pojedynczego stołu", ale wystarczająco zbliżone w wielu sytuacjach.

2

Może to być przydatne: https://github.com/craigds/django-typed-models Wygląda to na pewną implementację dziedziczenia pojedynczej tabeli, ale ma ograniczenie, że podklasy nie mogą mieć żadnych dodatkowych pól.

istnieje również widelec, który rozwiązuje ten problem nie jest w stanie utworzyć dodatkowe pola: https://github.com/KrzysiekJ/django-typed-models

zmiana: Wierzę, że widelec może zostały połączone z powrotem w

o to ostatnie dyskusje na temat Django developer lista dyskusyjna o STI: https://groups.google.com/forum/#!msg/django-developers/-UOM8HNUnxg/6k34kopzerEJ

Powiązane problemy