子应用程序中“自我”的 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字段的查询集