Wskazówki od mojego przełożonego: „Chcę uniknąć umieszczania jakiejkolwiek logiki w models.py
. Odtąd używajmy jej tylko jako klas dostępu do bazy danych i zachowajmy całą logikę w klasach zewnętrznych, które używają klas modeli, lub zawiń je”.
Czuję, że to niewłaściwa droga. Uważam, że trzymanie logiki z dala od modeli tylko po to, aby plik był mały, to zły pomysł. Jeśli logika jest najlepsza w modelu, to właśnie tam powinna iść, niezależnie od rozmiaru pliku.
Czy jest więc prosty sposób na użycie po prostu obejmuje? Mówiąc językiem PHP, chciałbym zaproponować przełożonemu, że właśnie models.py
uwzględniliśmy () modele klas z innych miejsc. Koncepcyjnie pozwoliłoby to modelom na posiadanie całej logiki, jakiej oczekujemy, jednocześnie zmniejszając rozmiar pliku poprzez zwiększenie liczby plików (co prowadzi do mniej problemów z kontrolą wersji, takich jak konflikty itp.).
Czy jest więc prosty sposób na usunięcie klas modeli z pliku models.py, ale czy modele nadal działają ze wszystkimi narzędziami Django? A może istnieje zupełnie inne, ale eleganckie rozwiązanie ogólnego problemu z „dużym” plikiem models.py? Każdy wkład będzie mile widziany.
źródło
Odpowiedzi:
Django zostało zaprojektowane tak, aby umożliwić tworzenie wielu małych aplikacji zamiast jednej dużej aplikacji.
Wewnątrz każdej dużej aplikacji znajduje się wiele małych aplikacji, które walczą o wolność.
Jeśli
models.py
czujesz się duży, robisz za dużo. Zatrzymać. Zrelaksować się. Rozkładać się.Znajdź mniejsze, potencjalnie wielokrotnego użytku komponenty lub części aplikacji. Nie masz do faktycznie używać ich. Po prostu pomyśl o nich jako o potencjalnie wielokrotnego użytku.
Zastanów się nad ścieżkami aktualizacji i zdekomponuj aplikacje, które możesz chcieć zastąpić któregoś dnia. Nie trzeba faktycznie je zastąpić, ale można uznać je jako „moduł” stand-alone programowania, które mogą się zastąpić czymś chłodnicy w przyszłości.
Mamy kilkanaście aplikacji, z których każda
model.py
ma nie więcej niż około 400 linii kodu. Wszystkie są dość skoncentrowane na mniej niż pół tuzinie dyskretnych definicji klas. (To nie są twarde ograniczenia, to obserwacje dotyczące naszego kodu).Rozkładamy się wcześnie i często.
źródło
Naturalne jest, że klasy modelu zawierają metody do działania na modelu. Jeśli mam model Book z metodą
book.get_noun_count()
, to właśnie tam należy - nie chcę pisać "get_noun_count(book)
", chyba że metoda faktycznie należy do innego pakietu. (Może - na przykład, jeśli mam pakiet dostępu do interfejsu API Amazona za pomocą „get_amazon_product_id(book)
”).Wzdrygnąłem się, gdy dokumentacja Django sugerowała umieszczenie modeli w jednym pliku i poświęciłem kilka minut od samego początku, aby wymyślić, jak podzielić go na odpowiedni podpakiet.
__init__.py
wygląda jak:from .book import Book
więc nadal mogę napisać „from site.models import Book”.
Jedyna sztuczka polega na tym, że musisz jawnie ustawić aplikację każdego modelu z powodu błędu w Django: zakłada się, że nazwa aplikacji jest trzecią do ostatniej pozycji w ścieżce modelu. „site.models.Book” daje w wyniku „site”, co jest poprawne; „site.models.book.Book” powoduje, że nazwa aplikacji to „modele”. To dość paskudny hack ze strony Django; powinien prawdopodobnie przeszukać listę zainstalowanych aplikacji pod kątem dopasowania przedrostka.
class Book(models.Model): class Meta: app_label = "site"
Prawdopodobnie możesz użyć klasy bazowej lub metaklasy, aby to uogólnić, ale jeszcze się tym nie przejmowałem.
źródło
Nie do końca rozumiem, który z wielu możliwych problemów możesz mieć. Oto kilka możliwości z odpowiedziami:
wiele modeli w tym samym pliku
Umieść je w osobnych plikach. Jeśli istnieją zależności, użyj importu, aby pobrać dodatkowe modele.
dodatkowe funkcje logiczne / narzędziowe w models.py
Umieść dodatkową logikę w osobnych plikach.
statyczne metody wybierania niektórych instancji modelu z bazy danych
Utwórz nowego menedżera w oddzielnym pliku.
metody oczywiście związane z modelem
save, __unicode__ i get_absolute_url to przykłady.
źródło