ForeignKey для 'self' в подпрограмме выдает ошибку при makemigrations в проекте Django - PullRequest
0 голосов
/ 23 сентября 2018

В настоящее время я работаю над большим проектом Django (версия 1.10.7) и сталкиваюсь с ошибкой с полем модели в субприложении.Вот как выглядит основная структура:

project/
    app_one/
        __init__.py
        apps.py
        models.py
        urls.py
        views.py
        app_two/
            __init__.py
            apps.py
            models.py
            urls.py
            views.py

Рассматриваемая модель и поле выглядят так (project/app_one/app_two/models.py):

class SampleModel(model.Model):
    parent = models.ForeignKey('self', null=True, blank=True, related_name='members')

Когда я запускаю python manage.py makemigrations app_one.app_two в корнепапка Я получаю это сообщение об ошибке:

Файл ... / django / db / models / utils.py ", строка 23, в make_model_tuple" должна иметь форму 'app_label.ModelName'. "% model ValueError: Недопустимая ссылка на модель 'app_one.app_two.SampleModel'. Строковые ссылки на модель должны иметь форму 'app_label.ModelName'.

Вот код из других соответствующих файлов:

project / settings.py :

INSTALLED_APPS = filter(None, (
    ...
    'app_one',
    'app_one.app_two',
    ...
)

project / app_one / app_two / apps.py :

from __future__ import unicode_literals

from django.apps import AppConfig


class AppOneAppTwoConfig(AppConfig):
    name = 'app_one.app_two'
    label = 'app_one.app_two'

project / app_one / app_two / __ init __. Py :

default_app_config = 'app_one.app_two.apps.AppOneAppTwoConfig'

Я считаю, что ошибка в том, что Django ищет только один . в полном названии модели (app_one.app_two.SampleModel), чтобы отделить ярлык приложения от названия модели в django/db/models/utils.py, и, поскольку в этом случае их два, произойдет сбой.

У меня вопрос : Это выглядит каккак странно, что Django не следует учитывать ... есть ли в любом случае сохранение точечной нотации метки приложения и все еще иметь внешнюю ссылку на ForeignKey во вложенном приложении?

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018

Я смог решить эту проблему, изменив app_label на 'app_one_app_two' в apps.py.Поскольку django ссылается на это при регистрации связанных моделей, он не ломается.Все миграции затем регистрируются под этим ярлыком.

0 голосов
/ 24 сентября 2018

Как вы упоминаете, , похоже, ошибка поиска , когда проект пытается найти ваше приложение из-за вложенных приложений.Эту проблему можно решить, указав имя приложения с помощью app_label во внутреннем метаклассе модели:

class SampleModel(models.Model):
    ...
    class Meta:
        app_label = 'app_two'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...