Модели доступа Django 2.0 (CREATE / REMOVE / FILTER) Автономный [без оболочки manage.py] - PullRequest
0 голосов
/ 28 июня 2018

У меня есть проект Django , и я хотел сгенерировать некоторые объекты (из моделей)

То, что я пытаюсь получить: Автономный Python Скрипт для создания группы объектов и / или фильтрации, удаления.

после импорта модели с from apps.base.models import MyModel и настройку конфигурации в соответствии с предыдущими вопросами StackOverflow предложили мне не удалось запустить сценарий.

import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myProject.settings")
import django

django.setup()
from apps.base.models import MyModel

Обратите внимание, что это на Django версии 2.0.6 [Django 2.0 +] .

Использованы правильные настройки (, т.е. myProject.settings)

  • После правильной настройки всего остального я получаю следующую ошибку:

    • RuntimeError: Model class apps.base.models.MyModel doesn't declare an explicit app_label and isn't in an application in INSTALLED_APPS.

Настройки:

Полная ссылка на GitHub находится здесь: https://github.com/teratzu/Razred-Management

Ответы [ 3 ]

0 голосов
/ 03 июля 2018

Я вижу две проблемы в текущей структуре проекта.

Отсутствует AppConfig

Как правильно сказал другой ответ, вам нужно предоставить подкласс AppConfig для регистрации вашего приложения; см. раздел Настройка приложений в Django docs.

Тем не менее, наличие пакета apps для объявлений пространства имен вполне подходит, особенно если вы планируете иметь несколько приложений; Фактически, это то, что Django делает сам , объединяя все приложения для батарей в пространстве имен django.contrib. В своей работе мы также используем общие пространства имен для организации приложений Django: mycompany.internal.someapp, mycompany.customers.otherapp и т. Д.

Так что вам не нужно перемещать файлы. Просто укажите apps.base правильно: создайте файл apps/base/apps.py с содержанием:

# apps/base/apps.py
from django.apps import AppConfig


class MyBaseAppConfig(AppConfig):
    name = 'apps.base'

Теперь ссылка на созданный класс конфигурации приложения apps.base в настройках:

# DzenanElvir/settings/base.py

INSTALLED_APPS = [
    ...
    # Local apps
    'apps.base.apps.MyBaseAppConfig',
]

Если apps должен быть пакетом, относитесь к нему как к одному

Итак, вы объявили пакет apps (поместив файл __init__.py в каталог apps). Однако вы никогда не используете пакет, вместо этого возитесь с sys.path, добавив к нему apps dir. Если приложение должно быть импортировано в apps.base, удалите строку путаницы в DzenanElvir/settings.base.py:

# remove this line:
path.append(os.path.join(PROJECT_ROOT, "apps"))

и используйте правильный импорт по всему приложению, заменяя:

  • from .models с from apps.base.models
  • from .forms с from apps.base.forms
  • from .pregledView с from apps.base.pregledView
  • from .postsView с from apps.base.postsView

Также не забудьте заменить

urlpatterns = [
    url(r'', include('base.urls')),
    ...
]

с

urlpatterns = [
    url(r'', include('apps.base.urls')),
    ...
]

в DzenanElvir/urls.py и вам следует идти.

0 голосов
/ 05 июля 2018

Я еще раз git clone заполнил репозиторий вашего проекта Django и получил его без необходимости переделывать структуру вашего проекта, выполнив следующее:


1. Переработайте вашу settings.BASE_DIR переменную

Как правило, путь к файлу настроек проекта Django projectname/settings.py, но для отдельных настроек это projectname/settings/<env_name>.py.

Следовательно, BASE_DIR необходимо переработать с:

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

до:

BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

для учета дополнительной директории между корнем проекта и файлом настроек.


2. Изменить объявление приложения в INSTALLED_APPS:

Пунктирная позиция вашего приложения с BASE_DIR равна apps.base. Заменить текущую декларацию base на apps.base.


3. Исправить пунктирные пути:

Если из-за точечных путей возникнут какие-либо ошибки, проверьте трассировку, так как она укажет на проблему. Например, ваш текущий urls.py, вероятно, вызовет проблему, потому что есть пунктирный путь к base.urls, тогда как это должен быть явный apps.base.urls. Например:

urlpatterns = [
    url(r'', include('base.urls')),
    ...
]

К следующему:

urlpatterns = [
    url(r'', include('apps.base.urls')),
    ...
]

4. Модели Migrate

Выполнить ./manage.py makemigrations && ./manage.py migrate.

Также, как примечание, каталоги migrations не должны быть в .gitignore. Читайте: Должен ли я добавлять файлы миграции Django в файл .gitignore?



И с этим я смог запустить скрипт ниже, в корне проекта Django, без ошибки:

import os
import django

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "DzenanElvir.settings.base")
django.setup()
from apps.base.models import ModelRazred
0 голосов
/ 03 июля 2018

Я git clone заполнил репозиторий вашего проекта Django и запустил его, выполнив следующее:


1. Переместить приложения вашего проекта в корень проекта

Это общий стандарт Django. Я сделал ./manage.py startapp base, чтобы начать все заново, а затем добавить все файлы / каталоги из каталога apps/base в только что созданный каталог base. Это должно выглядеть следующим образом в корневом каталоге вашего проекта (где DzenanElvir & base - это каталоги):

(.env) Cole:StackOverflow/Razred-Management ‹master*›$ ls -l              
total 512
drwxr-xr-x   9 Cole  staff     288 Jul  2 23:50 DzenanElvir
-rw-r--r--   1 Cole  staff    1055 Jul  2 23:48 LICENSE
-rw-r--r--   1 Cole  staff     299 Jul  2 23:48 Pipfile
-rw-r--r--   1 Cole  staff   27343 Jul  2 23:48 Pipfile.lock
-rw-r--r--   1 Cole  staff      72 Jul  2 23:48 Procfile
-rw-r--r--   1 Cole  staff    1160 Jul  2 23:48 README.md
drwxr-xr-x  15 Cole  staff     480 Jul  3 00:06 base
...

И вот так в вашем новом каталоге приложений base:

(.env) Cole:Razred-Management/base ‹master*›$ ls -l
total 80
-rw-r--r--   1 Cole  staff    53 Jul  2 23:58 __init__.py
drwxr-xr-x  11 Cole  staff   352 Jul  3 00:08 __pycache__
-rw-r--r--   1 Cole  staff    63 Jul  3 00:04 admin.py
-rw-r--r--   1 Cole  staff    83 Jul  3 00:04 apps.py
-rw-r--r--   1 Cole  staff  2004 Jul  2 23:58 forms.py
drwxr-xr-x   5 Cole  staff   160 Jul  3 00:06 migrations
-rw-r--r--   1 Cole  staff  1126 Jul  2 23:58 models.py
-rw-r--r--   1 Cole  staff  2236 Jul  2 23:58 postsView.py
-rw-r--r--   1 Cole  staff  1913 Jul  2 23:58 pregledView.py
drwxr-xr-x   3 Cole  staff    96 Jul  2 23:58 templates
-rw-r--r--   1 Cole  staff    60 Jul  3 00:04 tests.py
-rw-r--r--   1 Cole  staff  1425 Jul  2 23:58 urls.py
-rw-r--r--   1 Cole  staff   343 Jul  2 23:58 views.py

2. Добавьте base приложение к INSTALLED_APPS более понятным способом

Обратите внимание на новый файл base/apps.py, мы собираемся использовать его класс AppConfig, чтобы объявить его установленным приложением. Заменить объявление INSTALLED_APPS 'base' на 'base.apps.BaseConfig'.


3. Переработайте вашу settings.BASE_DIR переменную

Как правило, путь к файлу настроек проекта Django - projectname/settings.py, но для отдельных настроек - projectname/settings/<env_name>.py.

Следовательно, BASE_DIR необходимо переработать из:

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

до:

BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

для учета дополнительной директории между корнем вашего проекта и файлом настроек.


4. Миграция моделей

Выполнить ./manage.py makemigrations && ./manage.py migrate.

Также, как примечание, каталоги migrations не должны быть в .gitignore. Читайте: Должен ли я добавлять файлы миграции Django в файл .gitignore?



И с этим я смог запустить скрипт ниже, в корне проекта Django, без ошибки:

import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "DzenanElvir.settings.base")
import django

django.setup()
from base.models import ModelRazred
...