2009-12-10 15 views
20

To jest dość proste pytanie o wzory django. Mój kod menedżera zazwyczaj występuje w models.py, ale co się dzieje, gdy model .py jest naprawdę ogromny? Czy istnieje inny alternatywny wzór pozwalający na używanie kodu menedżera w models.py w celu zachowania łatwości konserwacji i unikania importu cyklicznego?Gdzie powinien być kod menedżera django?

Można zadać pytanie, dlaczego models.py jest tak ogromny, ale załóżmy, że jego rozmiar i szerokość użyteczności jest uzasadniona.

Odpowiedz

21

Wolę zachować moje modele w models.py i menedżerów w manage.py (formularze w forms.py) wszystko w tej samej aplikacji. W przypadku bardziej ogólnych menedżerów wolę zachować je w core.managers, jeśli można je ponownie wykorzystać w innych aplikacjach. W niektórych z naszych większych aplikacji z modelami/modelname.py, które zawierają menedżera i kod modelu, który nie wydaje się zły.

+1

Jak w takim razie radzisz sobie z modelem .py wymagającym importowania manage.py i na odwrót? – Jeff

+24

manage.py nie powinien importować modeli - dany model będzie zawsze dostępny jako 'self.model' na menedżerze. – jacobian

+5

To świetnie ... chyba że zestaw kwerend menedżera musi odwoływać się do innego modelu - nie można go zaimportować i MUSI umieścić go w models.py (np. Jeśli wykluczasz elementy istniejące w innym modelu itp.). –

3

Co zrobiłem, budując aplikacje Django, było stworzenie pliku [modelname] .py z określonym kodem modelu, kodem menedżera, a czasem także z kodem formularza i użyto pliku __init__.py do zaimportowania, a następnie wszystkich w katalogu modeli. Pomogło mi to w utrzymaniu jej w zarządzaniu.

+0

Gdybym miał to zrobić, umieściłbym wszystkie te pliki w folderze 'models'. Utrzyma root aplikacji w czystości i lepiej organizuje import. – jangeador

6

Zawsze umieszczam moje w manage.py. Jeśli masz problem z okrężnym importowaniem pamiętaj, że a) Możesz odwoływać się do klasy modelu dla menedżera w self.model, oraz b) Możesz importować wewnątrz funkcji.

+0

+1 za przypomnienie nam, że można zaimportować do wnętrza funkcji. W moim przypadku musiałem użyć zewnętrznego modelu dla mojego managera i dodałem '' apps.get_model (app_label = 'nazwa_aplikacji', nazwa_modelu = 'nazwa_modelu') '' wewnątrz metody – jangeador

7

Najlepszym wyborem z dużym zestawem modeli jest użycie modułów django na swoją korzyść i po prostu utworzenie folderu o nazwie modele. Przenieś stary models.py do tego folderu modeli i zmień jego nazwę na __init__.py. Pozwoli to na rozdzielenie każdego modelu na bardziej szczegółowe pliki wewnątrz tego folderu modelu.

Następnie wystarczy zaimportować każdy model do przestrzeni nazw __init__.py.

Tak więc, na przykład, może chcesz rozdzielić na:

yourapp/ 
    models/ 
     __init__.py # This file should import anything from your other files in this directory 
     basic.py # Just an example name 
     morespecificmodels.py # Just an example name 
     managers.py # Might want to separate your manager into this 

wówczas __init__.py może być tylko:

from basic import * # You should replace * with each models name, most likely. 
from managers import YourManager # Whatever your manager is called. 

Jest to struktura, która używam kiedy moje pliki modelowe dostać Ogromne, jednak staram się rozdzielać rzeczy na bardziej wtykowe aplikacje tak często, jak to możliwe - więc rzadko mnie to wykorzystuje.

Mam nadzieję, że to pomoże.