2013-02-18 69 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

相關問題