8

我在名为“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)

我很感激反馈

4

5 回答 5

14

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

该错误意味着它所说的 WorkoutRecord 未在您的 Activity 类中定义。

首先检查这两件事:

1)你导入了吗?

2) WorkoutRecord 是在 Activity 之前定义的吗?

于 2013-04-23T20:42:24.113 回答
5

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

于 2013-04-23T20:41:34.430 回答
4

你有两个选择:

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

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

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

  2. 您可以使用字符串作为 a 的第一个参数,ForeignKey或者ManytoManyField指定您希望与之建立关系的模型。这是一个 django 功能。如果您查看有关关系的文档ForeignKey,它会说:

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

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

于 2013-04-23T20:42:58.710 回答
2

使用'yourapp.Model'格式。

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

带引号。

于 2013-04-23T20:40:16.017 回答
0

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

class foreignClass(models.Model):
    category_id = models.ForeignKey('Product_categories', on_delete=models.CASCADE)
于 2019-08-02T17:55:30.063 回答