我目前正在处理一个大型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来说,这似乎很不可思议...无论如何,它仍然保留了应用标签的点符号,并且在子应用程序?
答案 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在注册相关模型时引用了此内容,所以它不会中断。然后,所有迁移也都以该标签注册。