20

Это довольно простой вопрос о шаблонах django. Мой менеджерский код обычно живет в models.py, но что происходит, когда models.py действительно огромна? Есть ли другой альтернативный шаблон, позволяющий вашему менеджерскому коду жить в models.py для удобства обслуживания и избежать циклического импорта?Где должен находиться код менеджера django?

Можно задать вопрос о том, почему models.py настолько велика, но давайте просто предположим, что размер и ширина полезности оправданы.

ответ

21

Я предпочитаю хранить свои модели в models.py и менеджерах в менеджерах.py (forms in forms.py) все в одном приложении. Для более общих менеджеров я предпочитаю хранить их в core.managers, если их можно повторно использовать для других приложений. В некоторых наших больших приложениях с моделями/modelname.py, которые будут содержать менеджер и код модели, который не кажется плохим.

+1

Как вы тогда разбираетесь с моделями.py нужно импортировать manage.py и наоборот? – Jeff

+24

manager.py не нужно импортировать модели - модель, о которой идет речь, всегда будет доступна как 'self.model' в менеджере. – jacobian

+5

Это здорово ... если QuerySet вашего менеджера не должен ссылаться на другую модель - тогда вы не можете импортировать его и ДОЛЖНЫ положить его в models.py (например, если вы исключаете элементы, которые существуют в другой модели и т. Д.). –

3

Что я делал при создании приложений Django, я должен был создать файл [modelname] .py только с конкретным кодом модели, кодом менеджера и иногда формировать код и использовать файл __init__.py для импорта, а затем все в каталоге моделей. Это помогло мне по-прежнему поддерживать ее.

+0

Если бы я собирался это сделать, я бы поместил все эти файлы в папку 'models'. Он сохранит чистый корневой каталог приложения и улучшит организацию импорта. – jangeador

6

Я всегда размещаю шахту в менеджерах.py. Если у вас есть проблема с циклическим выпуском, помните, что a) вы можете ссылаться на класс модели для менеджера на self.model и b) вы можете импортировать внутри функций.

+0

+1 для напоминания о том, что вы можете импортировать внутри функции. В моем случае мне пришлось использовать внешнюю модель для моего менеджера, и я добавил '' apps.get_model (app_label = 'app_name', model_name = 'model_name') '' внутри метода – jangeador

7

Ваш лучший выбор с большим набором моделей - использовать модули django в ваших интересах и просто создать папку с именем models. Переместите ваши old models.py в эту папку моделей и переименуйте ее __init__.py. Это позволит вам разделить каждую модель на более конкретные файлы внутри этой папки модели.

Вам понадобится импортировать каждую модель только в пространство имен __init__.py.

Так, например, вы можете разделить его на:

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 

Тогда ваш __init__.py может быть просто:

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

Это структура, которую я использую, когда мои файлы модели получить но я стараюсь разделить вещи на более подключаемые приложения как можно чаще, так что это редко используется мной.

Надеюсь, это поможет.

Смежные вопросы