子应用程序中“自己”的ForeignKey在Django项目的makemigrations中引发错误

时间:2018-09-23 06:56:47

标签: python django python-2.7 django-models django-1.10

我目前正在处理一个大型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来说,这似乎很不可思议...无论如何,它仍然保留了应用标签的点符号,并且在子应用程序?

2 个答案:

答案 0 :(得分:0)

如您所述,it seems to be a lookup error是由于嵌套的应用程序而导致项目试图查找您的应用程序时。这可以通过在模型内部元类中使用app_label指定应用名称来解决:

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

答案 1 :(得分:0)

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