Как разделить файлы django 'models.py', 'views.py', 'serializers.py' на несколько файлов
Здравствуйте,
В образовательных целях я создаю приложение django с несколькими моделями и отношениями.
Согласно официальному руководству и многим реализациям, которые я нашел в Интернете, модели базы данных и сериализаторы, а также представления определяются в отдельных файлах: "models.py", "serializers.py" и "views.py".
Итак, каталог проекта выглядит следующим образом:
> my_app
> migrations
> __init__.py
> admin.py
> models.py
> apps.py
> serializers.py
> tests.py
> urls.py
> views.py
В зависимости от того, сколько моделей включено в приложение, эти файлы могут вырасти до сотен или даже тысяч строк кода.
В результате разработка и поддержка приложения становится чрезвычайно сложной задачей.
Я хотел бы разделить эти файлы так, чтобы каждая модель (и соответствующие ей сериализатор и представление) были определены в отдельном файле для каждой модели.
Следующим образом:
> my_app
> migrations
> models
> __init__.py
> model1.py
> model2.py
> model3.py
> model4.py
> serializers
> __init__.py
> model1_serializers.py
> model2_serializers.py
> model3_serializers.py
> model4_serializers.py
> views
> __init__.py
> model1_views.py
> model2_views.py
> model3_views.py
> model4_views.py
> __init__.py
> admin.py
> apps.py
> tests.py
> urls.py
Я столкнулся с некоторыми трудностями при разбиении этих файлов и пока не нашел оптимального решения.
Проблема
Для того чтобы определить сериализатор -> соответствующая модель должна быть импортирована.
А для определения представления -> должны быть импортированы соответствующие модель и сериализаторы.
Возникают некоторые трудности при импорте объектов из моделей/файлов, расположенных на том же уровне, что и родительская директория. Например: Импорт модели в serializers/model1_serializers.py приводит к ошибке
from models.model1 import Model1 # error: Нерешенная ссылка 'models'
from my_app.models.model1 import Model1 # error: Unresolved reference 'my_app'
Что я пробовал
- Отметьте каталог проекта как исходный в pycharm - После того, как вы отметили папку "my_app" как исходную, следующий импорт работает. Но выполнение кода вне pycharm (например, в cmd) приводит к ошибкам импорта.
from models.model1 import Model1
- Добавление директории проекта в sys.path - sys.path содержит список директорий, в которых интерпретатор будет искать необходимый модуль. Добавление следующих строк должно сделать импорт возможным (в файле my_app/views/model1_views.py), но это не работает, pycharm по-прежнему отмечает строки импорта как ошибки. Вы знаете, где моя ошибка?
import os from sys import path path.append(os.path.dirname(os.path.dirname(__file__))) from my_app.models.model1 import Model1
Я буду очень признателен, если вы объясните мою ошибку и предложите решение для разделения этих файлов, спасибо!
Не знаю, целесообразно ли создавать новый файл представления и сериализатора для каждой модели, это делает все беспорядочным по мере роста приложения.
Если это только модель, вы можете сделать то, что упоминается в Django docs
Где вы можете удалить файл models.py и вместо этого создать каталог models и разместить в нем различные файлы моделей, как например: myapp/models/
, myapp/models/first_model.py
и т.д.
Но если вы в принципе хотите разделить проблемы, вы можете создать новое приложение Django для каждой функции/проблемы, например, так:
> my_app_one
> migrations
> __init__.py
> admin.py
> models.py
> apps.py
> serializers.py
> tests.py
> urls.py
> views.py
> my_app_two
> migrations
> __init__.py
> admin.py
> models.py
> apps.py
> serializers.py
> tests.py
> urls.py
> views.py
Это должно решить вашу проблему с импортом.
Вместо того, чтобы создавать несколько моделей, сериализаторов и файлов представлений, создайте несколько приложений!
Такой способ более упорядочен, а также вы можете связывать приложения вместе и импортировать все, что вам нравится, из других приложений!
You need to add a package __init__.py file in my_app, and import from there:
from my_app import models
models.Model1.objects.all()
This tells Python that my_app is a package, and makes the submodules importable from it.
You thus structure your project as:
my_app/
__init__.py
models/
__init__.py
model1.py
model2.py
...
serializers/
__init__.py
...
views/
__init__.py
...
...
And then import from the my_app package.
Note that often models, serializers and views are grouped per application, not per model. So you make app1, app2, etc. subpackages, and place the models, serializers and views for that app in there.