子应用程序中 'self' 的 ForeignKey 在 Django 项目中的 makemigrations 上抛出错误

ForeignKey to 'self' in sub-application throws error on makemigrations in Django project

我目前正在处理一个大型 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 时,我收到此错误消息:

File .../django/db/models/utils.py", line 23, in make_model_tuple "must be of the form 'app_label.ModelName'." % model ValueError: Invalid model reference 'app_one.app_two.SampleModel'. String model references must be of the form '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来说,这似乎很奇怪不考虑......是否有保留应用程序标签的点符号并且仍然有一个自我- 在子应用程序中引用外键?

如您所述,it seems to be a lookup error when the project is trying to locate your app due to the nested apps. This can be solved by specifying the app name with an app_label 在模型内部元 class:

class SampleModel(models.Model):
    ...
    class Meta:
        app_label = 'app_two'

我可以通过将 apps.py 中的 app_label 更改为 'app_one_app_two' 来解决这个问题。因为 django 在注册相关模型时引用了它,所以它不会中断。然后所有迁移也都在该标签下注册。