在ManytoManyFields中引用嵌套django应用程序的正确方法是什么

时间:2017-03-20 16:14:42

标签: python django migration

我正在尝试将旧的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。

1 个答案:

答案 0 :(得分:0)

您应该在Meta类中为模型定义app_label。无论你输入什么,都会成为你在ManyToManyField定义中使用的名称的第一部分。