为什么我一直得到NameError:名称'PS'没有定义

时间:2013-02-18 14:39:46

标签: python django class django-models

好的,在我的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:名称'PS'未定义

为什么会这样?

2 个答案:

答案 0 :(得分:10)

像mgilson所说,它从上到下。但Django有办法克服它 -

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

Django doc在ForeignKey下描述它。

  

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

你可以read more here

答案 1 :(得分: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)

你已经把自己放到鸡蛋角落了。你需要一只鸡,但你不能没有鸡蛋 - 但你不能没有鸡肉,但是... ...

最终,你需要做一些重构,这样两个类就不会相互依赖。

请注意,问题不会在方法中发生,因为在这种情况下,方法类在运行之前不会被查找 - 但是,由于类命名空间在创建类时被执行,因此您有{ {1}}。