Dziedziczenie umożliwia ponowne wykorzystanie kodu i tworzenie czystszych modeli danych. Ale Django oferuje więcej niż jeden sposób dziedziczenia, więc upewnij się, że znasz różnice.

Dziedziczenie modeli to funkcja Django ORM, która umożliwia programistom tworzenie hierarchicznych relacji między modelami baz danych. Umożliwia ponowne użycie kodu, rozszerzalność i czystszą bazę kodu dzięki wykorzystaniu zasad programowania obiektowego.

Niezależnie od tego, czy tworzysz złożoną aplikację internetową, czy pracujesz nad mniejszym projektem, dziedziczenie modelu może przynieść znaczące korzyści, takie jak zmniejszenie nadmiarowości i zapewnienie spójnego działania.

Rodzaje dziedziczenia modeli w Django

Django oferuje wsparcie dla trzech typów dziedziczenia modeli:

  1. Abstrakcyjne klasy bazowe.
  2. Dziedziczenie wielostolikowe.
  3. Modele zastępcze.

Każdy z tych typów dziedziczenia modeli ma zalety i będziesz ich używać do określonych celów.

Abstrakcyjne klasy bazowe

Abstrakcyjne klasy podstawowe zapewniają sposób definiowania wspólnych pól i metod, które mogą dziedziczyć wiele modeli. Na przykład, jeśli masz dwa modele współużytkujące podobne pola, możesz użyć abstrakcyjnej klasy bazowej do zdefiniowania podobnych pól. Spójrz na ten przykład:

instagram viewer

klasaKlient(modele. Model):
nazwa = modele. CharField (max_length=50)
e-mail = modele. EmailField()
identyfikator_klienta = modele. Pole liczby całkowitej()

klasaSprzedawca(modele. Model):
nazwa = modele. CharField (max_length=50)
e-mail = modele. EmailField()
sprzedawca_id = modele. Pole liczby całkowitej()

Powyższy fragment kodu definiuje dwa modele Django: Klient I Sprzedawca. Modele te mają dwa wspólne pola, a mianowicie nazwa I e-mail. Aby zapobiec tej nadmiarowości, możesz utworzyć osobny model do przechowywania wspólnych pól w Klient I Sprzedawca modele i uczynić je abstrakcyjnymi.

klasaInformacje użytkownika(modele. Model):
nazwa = modele. CharField (max_length=50)
e-mail = modele. EmailField()

klasaMeta:
streszczenie = PRAWDA

Powyższy fragment kodu definiuje nowy model i ustawia abstrakcyjny przypisują PRAWDA. Oznacza to, że model będzie abstrakcyjny, a Django nie utworzy tabeli w bazie danych.

Możesz przepisać Klient I Sprzedawca takie modele:

klasaKlient(Informacje użytkownika):
identyfikator_klienta = modele. Pole liczby całkowitej()

klasaSprzedawca(Informacje użytkownika):
sprzedawca_id = modele. Pole liczby całkowitej()

W powyższym fragmencie kodu plik Klient I Sprzedawców modele dziedziczą po Informacje użytkownika modelka zamiast modele. Model.

Możesz przeglądać swoje modele w panelu administracyjnym, rejestrując je w swoim admin.py taki plik:

z .modele import Klient, Sprzedawca

admin.site.register (Klient)
admin.site.register (Sprzedawca)

Przeprowadź migrację swoich trybów i uruchom serwer programistyczny, uruchamiając następujące polecenie na a wiersz poleceń:

python Manage.py makemigrations \
&& python Manage.py migracja \
&& python Manage.py serwer uruchomieniowy

Przejdź do strony administratora i zaloguj się przy użyciu danych superużytkownika. Powinny być widoczne wszystkie trzy pola dla każdego modelu.

W tym przykładzie Django stworzyło tabelę dla Klient I Sprzedawca modele. Widać, że Informacje użytkownika model nie ma tabeli, ponieważ jest abstrakcyjny.

Dziedziczenie wielu tabel

Możesz użyć dziedziczenia wielotabelowego, gdy model nadrzędny musi również istnieć jako tabela w bazie danych obok modelu podrzędnego.

W przeciwieństwie do dziedziczenia abstrakcyjnej klasy bazowej, gdzie model nadrzędny nie będzie tabelą w bazie danych, dziedziczenie wielotabelowe tworzy tabelę dla modelu nadrzędnego.

W przypadku dziedziczenia wielotabelowego model potomny dziedziczy wszystkie pola i metody z modelu nadrzędnego i dodaje określone pola. Klucz obcy pomóc w ustaleniu modelowa relacja między modelami nadrzędnymi i podrzędnymi.

Oto przykład dziedziczenia wielotabelowego:

klasaOsoba(modele. Model):
imię_imię = modele. CharField (max_length=100)
nazwisko_nazwisko = modele. CharField (max_length=100)

pokget_name(samego siebie):
powrótF"{self.first_name}{self.last_name}"

klasaMeta:
streszczenie = PRAWDA

klasaPracownik(Osoba):
identyfikator_pracownika = modele. CharField (max_length=20)
dział = modele. CharField (max_length=100)
wynagrodzenie = modele. FloatField()
dob = modele. PoleDaty()

klasaMenedżer(Pracownik):
tytuł = modele. CharField (max_length=100)

Ten fragment kodu definiuje trzy modele. Pierwszy model, tzw Osoba, jest abstrakcją. Określa tylko imię i nazwisko osoby.

Drugi model, tzw Pracownik, dziedziczy pola Osoba ale definiuje dodatkowe pola. The Pracownik model nie jest abstrakcyjny, więc będzie miał swoją tabelę w bazie danych.

Ostateczny model, tzw Menedżer, dziedziczy pola Pracownik model i dodaje pole o nazwie tytuł.

Związek między Pracownik I Menedżer nazywa się modele Dziedziczenie wielu tabel. Przeprowadź migrację modeli, zarejestruj je w admin.py, uruchom serwer i przejdź do panelu administracyjnego. Powinieneś zobaczyć dwie tabele utworzone przez Django.

Gdy spróbujesz dodać nowego menedżera, zauważysz, że ma on wszystkie pola z Pracownik model, jak również własne pole niestandardowe.

Modele zastępcze

Model zastępczy pomaga utworzyć nowy model, który rozszerza istniejący model bez tworzenia nowej tabeli bazy danych. W tego rodzaju dziedziczeniu modeli modele zastępcze i oryginalne będą współużytkować tę samą tabelę. Używając modeli proxy, możesz tworzyć takie rzeczy, jak tworzenie niestandardowych modeli i zmienianie domyślnych menedżerów.

Możesz utworzyć model proxy, dodając proxy=Prawda w Meta klasa. Oto przykład:

klasaModel proxy(Model podstawowy):

klasaMeta:
pełnomocnik = PRAWDA

Typowe użycie modelu proxy jest właściwe, gdy istnieje model podstawowy i istnieje potrzeba stworzenia jego specjalistycznej wersji z dodatkową funkcjonalnością. Oto podstawowy przykład:

klasaPost(modele. Model):
tytuł = modele. CharField (max_length=30)
autor = modele. CharField (max_length=30)

pok__str__(samego siebie):
powrót tytuł własny

klasaPoczta proxy(Post):

klasaMeta:
pełnomocnik = PRAWDA

Ten fragment kodu definiuje dwa modele: Post I Mój post. The Post model definiuje dwa pola dla tytułu i autora. The Poczta proxy model dziedziczy po Post Model.

Przeprowadź migrację powyższych modeli i dodaj nowy post do tabeli utworzonej dla Post Model.

Po dodaniu posta otwórz plik Stanowiska zastępcze tabela. Powinieneś znaleźć post, który dodałeś do Post w nim stół.

Zmiany, które wprowadzasz w postach w Stanowiska zastępcze tabela wpłynie na odpowiedni post w Post stole i odwrotnie. To dowodzi, że naprawdę dzielą ten sam stół.

Możesz zmodyfikować ul() metoda modelu proxy:

klasaPoczta proxy(Post):

klasaMeta:
pełnomocnik = PRAWDA
zamawianie = ["tytuł"]

pok__str__(samego siebie):
powrót sam.autor

Dzięki tej modyfikacji A ProxyPost reprezentacją ciągu będzie jego autor, a nie tytuł. Kolejność modelu proxy będzie również następować według tytułu zamiast domyślnego pola identyfikatora.

Korzystając z modeli proxy, należy pamiętać, że nie można dodawać niestandardowych pól do modelu proxy. Podstawowym przypadkiem użycia modeli proxy jest sytuacja, w której jeden model ma obsługiwać wiele zachowań.

Modele zastępcze pomagają zmienić zachowanie istniejącego modelu bez modyfikowania jego pól lub podstawowej struktury tabeli bazy danych.

Wykorzystaj dziedziczenie modelu do ponownego użycia kodu i struktury organizacyjnej

Wykorzystując różne techniki dziedziczenia modeli, możesz łatwo tworzyć uporządkowany kod wielokrotnego użytku dla swojego projektu.

Dziedziczenie modelu pozwala uniknąć nadmiarowego kodu i zwiększa łatwość konserwacji i skalowalność kodu. Ułatwia również poruszanie się po kodzie, wspierając w ten sposób efektywną współpracę między zespołami programistów.

Oprócz dziedziczenia modeli, Django oferuje dziedziczenie szablonów, które jest świetnym sposobem na zarządzanie i organizowanie szablonów dla twoich projektów.