找不到与 Django ForeignKey 问题相关的类

Posted

技术标签:

【中文标题】找不到与 Django ForeignKey 问题相关的类【英文标题】:Django ForeignKey issue related class not found 【发布时间】:2013-04-17 05:15:42 【问题描述】:

我在我的模型中的一个名为“Activity”的类下创建了以下 ForeignKey 字段

related_workoutrecord = models.ForeignKey(WorkoutRecord, null=True, blank=True)

ForeignKey 与名为 WorkoutRecord 的类相关,应允许为空。

添加此列后,我运行 South 并收到以下错误消息:

NameError: name 'WorkoutRecord' is not defined

对发生的事情有什么想法吗?我已经确认“WorkoutRecord”是我模型中的一个类。

我是否需要将 WorkoutRecord 写为字符串(带引号),例如:

related_workoutrecord = models.ForeignKey('WorkoutRecord', null=True, blank=True)

感谢您的反馈

【问题讨论】:

你能发布你的模型吗?声明的顺序也很重要 WorkoutRecord 类在哪里? 如果WorkoutRecord 的定义在Activity 的定义之下(在代码中),那么是的,你应该把它写在引号之间。 【参考方案1】:

根据我的评论,确保“Activity”类可以访问“WorkoutRecord”类。

错误的意思是,WorkoutRecord 未在您的 Activity 类中定义。

先检查这两件事:

1) 你导入了吗?

2) WorkoutRecord 是否在 Activity 之前定义?

【讨论】:

很棒的反馈! WorkoutRecord 的定义在 Activity 的定义下(在代码中),所以我将“WorkoutRecord”放在引号之间。似乎另一个选择是将 Activity 放在 WorkoutRecord 下方。 (在这种情况下,我不知道顺序很重要)。再次感谢! 我正在使用 south 来管理数据库迁移。你知道为什么 WorkoutRecord 必须在 Activity 之前定义,即使这两个模型之前已经迁移到数据库并且我只是在新迁移中添加 ForeignKey 字段?【参考方案2】:

WorkoutRecord 类必须在 Activity 类之前(即上面)定义,以便使用不带引号的类的引用。如果类之间存在循环引用,那么使用带引号的字符串版本将有助于获得对稍后在代码中定义的类的惰性引用。

【讨论】:

【参考方案3】:

你有两个选择:

    您可以从它所在的任何模块导入 WorkoutRecord 模型(这是标准的 Python 方法)

    from myapp.models import WorkoutRecord
    related_workoutrecord = models.ForeignKey(WorkoutRecord, null=True, blank=True)
    

    使用这种方法,有时您会遇到循环导入的情况,因此有另一种选择:

    您可以使用字符串作为ForeignKeyManytoManyField 的第一个参数来指定您希望与之建立关系的模型。这是一个 django 功能。如果您查看the documentation for ForeignKey relationships,它会说:

    如果您需要在尚未定义的模型上创建关系,您可以使用模型的名称,而不是模型对象本身:

    这意味着如果模型尚未定义,但位于同一模块中(即它位于当前代码下方),您可以只使用引号中的模型名称:'WorkoutRecord',但如果模型位于另一个应用程序/模块,您也可以将其指定为字符串:'myapp.WorkoutRecord'

【讨论】:

【参考方案4】:

使用'yourapp.Model' 格式。

foo = models.ForeignKey('yourapp.WorkoutRecord', null=True, blank=True)

带引号。

【讨论】:

【参考方案5】:

如果您在一个应用程序中有两个类名,请确保在它对我有用的引用类的名称周围添加单引号 ''。

class foreignClass(models.Model):
    category_id = models.ForeignKey('Product_categories', on_delete=models.CASCADE)

【讨论】:

以上是关于找不到与 Django ForeignKey 问题相关的类的主要内容,如果未能解决你的问题,请参考以下文章

Django Admin 中的 ForeignKey 或 ManyToMany 字段搜索

Django 模型,使用 auth_group 作为 ForeignKey

添加到帖子的评论:找不到页面 (404)

SQLAlchemy ForeignKey找不到表

为啥即使创建了对象,django 也找不到与查询匹配的任何对象

找不到 Django 404 错误页面...当前路径与最后一个匹配