从一个应用程序到Django中另一个应用程序的外键


94

我想知道是否有可能在Django的models.py文件中定义外键,该外键引用了另一个应用程序中的表?

换句话说,我有两个应用程序,分别称为cf和profile,在cf / models.py中,我拥有(以及其他功能):

class Movie(models.Model):
    title = models.CharField(max_length=255)

并希望在profile / models.py中拥有:

class MovieProperty(models.Model):
    movie = models.ForeignKey(Movie)

但是我无法正常工作。我试过了:

    movie = models.ForeignKey(cf.Movie)

并且我曾尝试在models.py的开头导入cf.Movie,但我总是会遇到错误,例如:

NameError: name 'User' is not defined

我是通过尝试以这种方式将两个应用程序绑定在一起来违反规则,还是只是语法错误?

Answers:


150

根据文档,您的第二次尝试应该可行:

要引用在另一个应用程序中定义的模型,必须改为显式指定应用程序标签。例如,如果上述制造商模型是在另一个称为生产的应用程序中定义的,则需要使用:

class Car(models.Model):
    manufacturer = models.ForeignKey('production.Manufacturer')

您是否尝试过将其用引号引起来?


1
相关文档可在此处
内森·琼斯

在许多应用程序中都可以使用外键吗?我正在做一个项目,其中一个项目中的许多应用程序具有许多带有许多外键的应用程序。仅供参考,我已经开始提出问题,但正在等待答案。stackoverflow.com/questions/55213918/...
田龙

我知道晚了,但这主要取决于选择和组织。我有一些永远不会供外部使用的“内部”应用程序。它们可以相互依赖,并且主要存在是为了给我方便地组织文件和名称空间。外部应用程序(例如,来自DjangoPackages的应用程序)和我可能有一天会向公众发布的应用程序,应尽可能保持免费,因为这些依赖关系(尽管对某些其他受良好支持的公共领域应用程序的依赖关系也可以)。与公共用户相关的应用取决于Django的用户/组/权限模型)。
nigel222 '19

23

也可以通过类本身:

from django.db import models
from production import models as production_models

class Car(models.Model):
    manufacturer = models.ForeignKey(production_models.Manufacturer)

9

好的-我知道了。您可以做到,只需使用正确的import语法即可。正确的语法是:

from prototype.cf.models import Movie

我的错误是没有指定该.models行的一部分。天哪!


10
有时您必须使用引号而不是导入,因为您可能会得到相互导入的文件。
Sam Stoelinga'3
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.