子应用程序中 '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 在注册相关模型时引用了它,所以它不会中断。然后所有迁移也都在该标签下注册。
我目前正在处理一个大型 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 在注册相关模型时引用了它,所以它不会中断。然后所有迁移也都在该标签下注册。