我正在尝试将旧的django应用程序从1.1.x更新为1.8 LTS,其中涉及更新路径,因为我的应用程序会移动应用程序。
但是,我无法为一个应用程序生成迁移,我无法看到如何正确引用命名空间的应用程序模型(假设这是问题)
如果我将文件从PROJECT / news / models移动到PROJECT / site_name / news / models,我应该如何在外键或ManyToManyFields中引用这些模型?
我有一个projects
应用我希望进行迁移。 some_org/projects
中的项目,并列在已安装的应用中,如下所示:
INSTALLED_APPS = (
'some_org.maps',
'some_org.library',
'some_org.extras',
'some_org.news',
'some_org.projects',
'some_org.members',
'some_org.comments',
)
所有具有命名空间的应用都在some_org
目录中。
以下是项目应用程序中模型文件的简略视图:
# some_org/projects/models.py
from some_org.library import Paper
class Project(models.Model):
name = models.CharField(max_length=30)
def get_children(self):
return ProjectPage.objects.filter(level=1, publish=True, project=self)
def has_library(self):
return Paper.objects.filter(projects=self).count() > 0
调用./manage.py makemigrations库,给出了这个错误:
ValueError: Lookup failed for model referenced by field library.Paper.projects: projects.Project
当我查看Paper模型时,它看起来像这样:
class Paper(models.Model):
# snip
# NewsLinkSubject, Projects et al used to in an app on
# the project root, like `./app_name/models.py`, but is now
# in `some_org/app_name/models.py`
subjects = models.ManyToManyField("news.NewsLinkSubject", blank=True)
projects = models.ManyToManyField("projects.Project", blank=True,)
country = models.ForeignKey("maps.Country", null=True, blank=True)
我最初想知道应用程序的标签是否错误,并尝试项目ManytoMany字段:
projects = models.ManyToManyField("some_org.projects.Project", blank=True,)
这会产生不同的错误:
ERRORS:
library.Paper.subjects: (fields.E300) Field defines a relation with model some_org.projects.Project', which is either not installed, or is abstract.
据我所知,应用程序已安装,且模型不是抽象的。
我很难过 - 我做错了什么,我该如何解决这个问题,以便我可以为这些应用程序进行迁移?
我正在使用Django 1.8.17和Python 2.7.13。
答案 0 :(得分:0)
您应该在Meta类中为模型定义app_label
。无论你输入什么,都会成为你在ManyToManyField定义中使用的名称的第一部分。