好的,在我的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'未定义
为什么会这样?
答案 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}}。