Django app_label неправильно на моделях - PullRequest
1 голос
/ 27 января 2020

У меня есть Django приложение DRF. Вот моя структура проекта.

myproject/
    myproject/
    apps/
        myApp1/
            __init__.py
            apps.py
            admin.py
            models.py
            urls.py
            views.py
        myApp2/
        __init__.py
    static/
    manage.py

, а мой INSTALLED_APPS содержит:

INSTALLED_APPS = [
    'apps.myApp1.apps.AppOneConfig',
    'apps.myApp2.apps.AppTwoConfig',
]

Когда я перешел на ./manage.py shell_plus и запустил:

SomeModel._meta.label

Я вижу myApp1 или myApp2 вместо apps.myApp1 && apps.myApp2. И даже в миграциях Модели обозначаются как myApp1.Model или myApp2.Model, а не apps.myApp1.Model или apps.myApp2.Model

Кроме того, указано AppConfig.

from django.apps import AppConfig


class AppOneConfig(AppConfig):
    name = 'apps.myApp1'
    verbose_name = 'My App One'


Ожидается ли это? Я довольно новичок в Django. Кто-нибудь может подсказать, в чем была ошибка?

1 Ответ

2 голосов
/ 27 января 2020

Это ожидается?

Да , что ожидается. По умолчанию метка приложения использует последнюю часть «python path». Вы можете изменить его, указав это в AppConfig [Django -doc] . Именно атрибут .label [Django -doc] этого AppConfig определяет метку приложения и:

(… ) По умолчанию используется последний компонент name. Это должен быть действительный Python идентификатор. (…)

Теперь атрибут .name [Django -doc] , а это:

Полный Python путь к приложению , например 'django.contrib.admin'.

Вы можете указать это, сначала указав AppConfig в файле __init__.py вашего myApp1 каталог:

# apps/myApp/__init__.py

default_app_config = <b>'apps.myApp.apps.App1Config'</b>

затем вы создаете файл apps.py в каталоге myApp1 и пишете:

# apps/myApp/apps.py

from django.apps import AppConfig

class <b>App1Config</b>(AppConfig):
    label = <b>'apps_myapp1'</b>

Примечание : обычно в каталогах используется slug_case, поэтому я думаю, что было бы лучше переименовать ваш myApp1 в myapp1 или my_app1.

РЕДАКТИРОВАТЬ : вам, таким образом, нужно установить атрибут label вашего AppOneConfig в:

class AppOneConfig(AppConfig):
    name = 'apps.myApp1'
    <b>label = 'apps_myapp1'</b>
    verbose_name = 'My App One'
...