2009-05-13 13 views
37

Rozpocząłem pracę nad aplikacją lokalną, która działa przez przeglądarkę. Po przejściu przez samouczek django myślę, że lepiej byłoby użyć django zamiast zwykłego pythona.Około 20 modeli w 1 aplikacji django

Jest jeden problem: mam co najmniej 20 modeli i każdy będzie miał wiele funkcji. Po prostu stworzy jeden ogromny plik modeli i prawdopodobnie także ogromne widoki. Jak je podzielić?

The models are all related, więc nie mogę po prostu zrobić z nich oddzielne aplikacje?

Odpowiedz

30

„Mam co najmniej 20 modeli” - to prawdopodobnie więcej niż jeden „app” Django i jest bardziej jak „projektu” Django z kilku małych „apps”

lubię podzielić rzeczy wokół tematów lub obszary tematyczne, które mają kilka (1 do 5) modeli. To staje się "aplikacją" Django - i jest użyteczną jednostką wielokrotnego użytku.

Ogólny "projekt" to zbiór aplikacji przedstawiający zintegrowaną całość zbudowaną z oddzielnych elementów.

Pomaga to również w zarządzaniu projektami, ponieważ każda "aplikacja" może stać się sprintem z wydaniem na końcu.

+1

Ale jeśli modele muszą odnosić się do siebie, w jaki sposób mogę umieścić je w osobnych aplikacjach? – Teifion

+2

Jeden model może z łatwością odnosić się do modeli w innym pakiecie. Prawie zawsze masz modele "wyższego poziomu" i "niższego poziomu". Zaimplementuj modele niższego poziomu w jednej aplikacji. Aplikacje na wyższym poziomie mogą zależeć od modeli aplikacji niższego poziomu. –

+13

Za każdym razem, gdy skonfigurujesz klucz obcy dla modelu użytkownika w django.contrib.auth, odnosisz się do różnych aplikacji ... –

0

Można podzielić modele na wiele plików. Dotyczy to również widoków.

0

Możesz można podzielić je na osobne pliki i po prostu mieć import na górze głównego pola models.py.

Niezależnie od tego, czy naprawdę chcesz chcesz to kolejne pytanie.

+0

Jak powiedział Jarret Hardie, utworzenie pakietu pythonowego (tj. Katalogu z plikiem __init__.py w nim) zwanymi modelami byłoby najlepszym sposobem na zrobienie tego. –

69

Jest to dość powszechne zapotrzebowanie ... Nie mogę sobie wyobrazić, brodząc pliku models.py który jest 10.000 linie długo :-)

można podzielić plik models.py (i views.py zbyt) w pacakge. W tym przypadku, drzewo projekt będzie wyglądać następująco:

/my_proj 
    /myapp 
     /models 
      __init__.py 
      person.py 

Plik __init__.py sprawia folder, w opakowaniu. Jedynym haczyka jest, aby mieć pewność, aby wyznaczyć wewnętrzną klasę Meta dla swoich modeli, które wskazują app_label dla modelu, w przeciwnym razie Django będzie miał kłopoty budowanie schematu:

class Person(models.Model): 
    name = models.CharField(max_length=128) 

    class Meta: 
     app_label = 'myapp' 

Po dokonaniu rejestracji, import modelu w swoim __init__.py złożyć tak, że Django i synchronizacji db znajdzie je:

from person import Person 

W ten sposób można jeszcze zrobić from myapp.models import Person

+0

Teoretycznie działa, ale uruchomienie linii z samouczka "python manage.py sql gui" nic nie robi, żadnego pomysłu co się dzieje? – Teifion

+1

To zwykle oznacza, że ​​django nie może znaleźć modeli. Upewnij się, że importujesz plik models.__init__.py i ustawiłeś app_label dla każdego modelu. Upewnij się też, że stary plik models.py został usunięty. –

+11

Jest to technicznie poprawne, ale bezwzględnie godne polecenia, ponieważ jest to w praktyce zły pomysł. Jeśli masz wystarczająco dużo modeli do rozmyślenia o dzieleniu models.py, powinieneś podzielić się na wiele aplikacji. –

16

modele są wszystkie związane, więc nie mogę po prostu zrobić z nich oddzielne aplikacje czy mogę?

Można można podzielić je na osobne aplikacje. Aby użyć modelu w jednej aplikacji z innej aplikacji, po prostu zaimportuj go w ten sam sposób, w jaki importujesz aplikacje django.contrib.

+14

+1. Nie ma przepisów przeciwko aplikacjom w zależności od siebie. – muhuk

5

Posiadanie 20 modeli w jednej aplikacji może oznaczać, że powinieneś podzielić je na mniejsze.

Celem aplikacji Django jest posiadanie małego, jednofunkcyjnego fragmentu kodu, który idealnie pasuje do siebie.

Tak więc, jeśli masz witrynę e-commerce, możesz mieć aplikację shopping_cart, aplikację rozliczeniową i tak dalej.

Należy pamiętać, że w aplikacjach nie ma problemu w zależności od siebie (chociaż zawsze jest lepiej, jeśli można je odłączyć), ale nie powinno się sprawić, aby aplikacja robiła dwie bardzo różne rzeczy.

Artykuł Django tips: laying out an application może ci pomóc. Jak zawsze, weź wszystko, co czytasz, z przymrużeniem oka (łącznie z tą odpowiedzią).

Powiązane problemy