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

Posted

技术标签:

【中文标题】子应用程序中“自我”的 ForeignKey 在 Django 项目中的 makemigrations 中引发错误【英文标题】:ForeignKey to 'self' in sub-application throws error on makemigrations in Django project 【发布时间】:2019-02-27 01:06:29 【问题描述】:

我目前正在处理一个大型 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’的形式。” % 模型 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 来说似乎很奇怪,无法解释......无论如何要保留应用标签的点表示法,并且在 a 中仍然有一个自引用 ForeignKey子应用?

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

是的,不幸的是,我尝试了您描述的方法,但也不起作用-同样的错误。似乎在解析相关字段时,无论如何都会引用 app_label ,并且双点会导致相同的错误。不过我能够解决它,我会针对我的问题创建一个突出我的解决方案的答案。 啊,你有没有试过在模型的Meta类中添加app_label = 'app_two' @ColtyHarrison 干杯,如果您想将其标记为您问题的解决方案,我已经更新了我的答案。【参考方案2】:

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

【讨论】:

以上是关于子应用程序中“自我”的 ForeignKey 在 Django 项目中的 makemigrations 中引发错误的主要内容,如果未能解决你的问题,请参考以下文章

如果它们来自我父母的其他子模块,我应该依赖 Maven 中的传递依赖吗?

使列表中的子对象自我转换为同一父对象的其他子对象的最佳方法

如何在Django Admin中过滤foreignkey字段的查询集

调用removeFromSuperview后如何防止子视图释放自我?

vue中怎么实现组件通信--自我总结

父子间组件的传值,子组件自我使用的解决办法