Django: NameError: 名称 'Category' 未定义
我正在练习Django,并且在使用一些在线教程来搭建一个博客网站。第一个项目进展得很顺利,但当我尝试第二个项目时,在开发第一个视图的时候,出现了这样一句话:
categories = models.ManyToManyField(Category, related_name ="packages")
在教程中,验证模型时没有错误,但当我运行验证命令时却出现了:NameError: name 'Category' is not defined
我仔细检查了所有文件的语法,没有发现任何语法错误,教程中也没有提到需要额外的导入。
这到底是怎么回事呢?
3 个回答
我遇到了下面的错误:
NameError: name 'Category' is not defined
这个错误是因为我在定义 Category
类之前,就把它设置成了 ForeignKey(),就像下面这样:
class Product(models.Model): # Error
category = models.ForeignKey(Category, on_delete=models.CASCADE)
name = models.CharField(max_length=50)
class Category(models.Model):
name = models.CharField(max_length=50)
所以,我把 Category
设置成 ForeignKey()
的位置改到了 Category
类定义之后,如下所示,这样错误就解决了:
class Category(models.Model):
name = models.CharField(max_length=50)
class Product(models.Model): # Here
category = models.ForeignKey(Category, on_delete=models.CASCADE)
name = models.CharField(max_length=50)
或者,我可以把 Category
用引号包起来再设置成 ForeignKey()
,如下所示,这样也能解决错误:
class Product(models.Model): # ↓ Here ↓
category = models.ForeignKey("Category", on_delete=models.CASCADE)
name = models.CharField(max_length=50)
class Category(models.Model):
name = models.CharField(max_length=50)
*你可以查看 我的问题和回答,里面解释了在 Django 模型字段中,类名用引号和不用引号的区别,以及如何建立外键关系。
在这里提到的“某些”内容是很有用的。
不过,问题在于你没有导入Category,或者你在模型中定义的Category和提到的关键字不一致。
听起来你可能刚接触Python,因为你提到“我仔细检查了所有文件的语法,没有发现任何语法错误,教程中也没有提到额外的导入。”
要知道,在Python中,很多与名称相关的错误是在运行时被发现的,而不是像C++那样在编译时就能发现。这在我刚开始用Python的时候也让我有点困惑。运行时错误可能只是简单的拼写错误等等。(如果这听起来有点糟糕,不用担心——有免费的工具可以像编译器一样检查你的程序,找出其他语言可能会发现的问题)
Category这个名字是在你提到的那行代码所在的文件中定义的吗?
如果不是,你必须特别导入Category这个名字。假设Category是在另一个文件argh.py中定义的。
import argh
这样是不行的。
你需要这样做:
from argh import Category
(或者你可以改成argh.Category来引用)
总之,除非你提供更多信息,否则你的问题很难得到更好的回答。那行代码本身不是问题。问题可能出在Category的定义上。Category的定义在哪里?Category是另一个模型类。应该有类似这样的代码:
class Category:
#....
而这段代码应该在同一个文件中,或者如果它在一个叫“prison.py”的文件中,那么你正在处理的文件应该包含:
from prison import Category