为什么我总是遇到NameError: name 'PS' is not defined

1 投票
2 回答
2801 浏览
提问于 2025-04-17 16:15

好的,在我的models.py文件里,我刚刚创建了这个:

class PL(models.Model):
  created = models.DateTimeField(default=timezone.now)
  owner = models.ForeignKey(User, related_name='PL')
  text = models.CharField(max_length=2000, blank=True)
  rating = models.IntegerField(default=0)
  pal = models.ManyToManyField(PS, blank=True, null=True)
  class Meta:
    verbose_name = "PL text"
  def __unicode__(self):
    return self.user

class PS(models.Model):
  Original = models.ForeignKey(PL, related_name='OPL', blank=True)
  rating = models.IntegerField(default=0)
  word = models.CharField(max_length=50, blank=True)

  def __unicode__(self):
    return "Word: %s" % (self.word)

但是我总是收到这个错误:NameError: name 'PS' is not defined

这是为什么呢?

2 个回答

1

在PL类里面:

pal = models.ManyToManyField(PS, blank=True, null=True)

你想用PS,但它还没被创建,因为Python脚本是从上到下读取的。通常,解决办法是先定义PS再定义PL,但对你来说这样不行,因为PS也依赖于PL

Original = models.ForeignKey(PL, related_name='OPL', blank=True)

你现在就像陷入了一个“鸡和蛋”的困境。你需要一只鸡,但没有蛋就得不到鸡;而没有鸡又无法得到蛋,真是个循环...

最终,你需要对代码进行一些重构,这样这两个类就不再互相依赖了。

注意,这个问题在方法内部不会出现,因为在那种情况下,方法的类在运行之前不会被查找。不过,由于类的命名空间在创建类的时候就会执行,所以你会遇到NameError

10

就像mgilson说的,Django是从上到下处理的。不过,Django有一种方法可以解决这个问题,具体做法是这样的 -

pal = models.ManyToManyField('PS', blank=True, null=True)

Django的文档在ForeignKey部分有详细说明。

如果你需要在一个还没有定义的模型上创建关系,可以直接使用模型的名字,而不是模型对象本身。

你可以在这里查看更多信息

撰写回答