为什么我总是遇到NameError: name 'PS' is not defined
好的,在我的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部分有详细说明。
如果你需要在一个还没有定义的模型上创建关系,可以直接使用模型的名字,而不是模型对象本身。
你可以在这里查看更多信息。