Django Makemigrations无法使用ForeignKey字段将其迁移到具有AppConfig的应用程序

2024-05-15 17:19:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我们有一个名为sessions的应用程序,由于Django有类似的django.contrib.sessions应用程序,我们需要创建一个AppConfig来修复“重复应用程序”错误,也就是说,我们将应用程序标签设置为common.sessions

因此,我们有以下文件夹/文件结构:

common
    sessions
        __init__.py
        apps.py
        models.py

__init__.py

default_app_config = 'common.sessions.apps.CommonSessionsConfig'

apps.py

class CommonSessionsConfig(AppConfig):
    name = 'common.sessions'
    label = 'common.sessions'

models.py

class SessionEventType(models.Model):
    name = models.CharField()

class SessionEventTypeMapping(models.Model):
    session_event_type = models.ForeignKey(SessionEventType)

settings.py

INSTALLED_APPS = (
    'common.sessions',
    ...
)

运行manage.py migrations将引发以下错误:

  File "/virtualenv/backoffice/lib/python2.7/site-packages/django/core/management/commands/makemigrations.py", line 125, in handle
    migration_name=self.migration_name,
  File "/virtualenv/backoffice/lib/python2.7/site-packages/django/db/migrations/autodetector.py", line 43, in changes
    changes = self._detect_changes(convert_apps, graph)
  File "/virtualenv/backoffice/lib/python2.7/site-packages/django/db/migrations/autodetector.py", line 111, in _detect_changes
    self.new_apps = self.to_state.apps
  File "/virtualenv/backoffice/lib/python2.7/site-packages/django/utils/functional.py", line 59, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
  File "/virtualenv/backoffice/lib/python2.7/site-packages/django/db/migrations/state.py", line 166, in apps
    return StateApps(self.real_apps, self.models)
  File "/virtualenv/backoffice/lib/python2.7/site-packages/django/db/migrations/state.py", line 248, in __init__
    raise ValueError(msg.format(field=operations[0][1], model=lookup_model))
ValueError: Lookup failed for model referenced by field common.sessions.SessionEventTypeMapping.session_event_type: common.sessions.common.sessions.SessionEventType

显然,它在这一部分失败,无法找到SessionEventType类/模型,即使它们只是在同一个models.py文件中,并且最终查找common.sessions.common.sessions.SessionEventType,这很奇怪:

session_event_type = models.ForeignKey(SessionEventType)

还尝试了此变体:

session_event_type = models.ForeignKey('common.sessions.SessionEventType')

但是它没有帮助,以及这个相关的issue。顺便说一下,我们仍在使用Py2/Django1.8,因为这是一个庞大的项目,我们无法轻松升级版本。我们错过什么了吗?检查了AppConfig/ForeignKey文档,但似乎没有相关信息。如果我们不使用FK字段,也不会抛出错误(即,可以进行非关系字段迁移)。我们只想让makemigrations工作


Tags: appsdjangopyselfvirtualenvmodelslibpackages