1

好的,在我的 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

为什么会这样?

4

2 回答 2

10

就像 mgilson 说的那样,它从上到下。但是 Django 有办法通过这样做来克服它 -

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

Django 文档在 ForeignKey 下对其进行了描述。

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

你可以在这里阅读更多

于 2013-02-18T14:44:47.473 回答
1

在 PL 类中:

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

你很想使用 PS,但它还没有被创建,因为 python 脚本是从上到下读取的。通常,解决方案是定义PSbefore PL,但这对您不起作用,因为也PS取决于PL

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

你已经让自己陷入了一个鸡蛋的角落。你需要一只鸡,但没有鸡蛋你不能得到它——但你不能没有鸡就得到鸡蛋,但是......

最终,您需要进行一些重构,以使这两个类不相互依赖。

请注意,问题不会发生在方法中,因为在这种情况下,方法类在运行之前不会被查找——但是,由于类命名空间在类创建时被执行,所以你有一个NameError.

于 2013-02-18T14:41:58.000 回答