2013-02-18 52 views
0

好吧,在我的models.py文件我刚刚创造了这个:为什么我不断收到NameError:名字“PS”没有定义

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

在点你是指PAL = models.ManyToManyField(PS,空白=真,空=真)你还没有定义的PS呢。 引用你的PS模型为一个字符串,Django会负责反思你的应用并找到模型。 PAL = models.ManyToManyField( 'PS' 的空=真,空=真) – andrefsp 2013-02-18 14:47:57

回答

9

像mgilson说,它会从上到下。不过在Django有办法通过这样做是为了克服它 -

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

Django的文档描述它ForeignKey的下。

If you need to create a relationship on a model that has not yet been defined, you can use the name of the model, rather than the model object itself.

您可以read more here

+0

+1为最干净的方法。 – dmg 2013-02-18 14:45:45

+0

有趣。有时我可能会尝试学习这个Django ... – mgilson 2013-02-18 14:46:14

+0

@mgilson Django有很多代码可以读取和从中学习。爱它的一个理由。 :d – 2013-02-18 14:53:31

1

在课堂PL:

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

你tyring使用PS,但它已经为python脚本会从上往下读尚未创建。通常情况下,解决办法是PL之前刚刚确定PS,但不会为你工作,因为PS取决于PL太:

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

您备份自己变成一个鸡 - 蛋角落。你需要一只鸡,但没有一个鸡蛋,你不能得到它 - 但没有一只鸡,你不能让一个鸡蛋,但...

归根结底,你需要做一些重构,使得两类不要相互依赖。

注意,问题不方法中,因为在这种情况下发生的,该方法的类不抬头,直到它们被运行 - 然而,由于创建类当类的命名空间得到执行,你有NameError

+0

在这样的情况下,可以借鉴国外的键作为一个可调用 'PS':https://docs.djangoproject.com/en/ 1.4/ref/models/fields /#foreignkey,但@mgilson是正确的,你需要重构。 – Brandon 2013-02-18 14:43:54

相关问题