2010-05-15 37 views
4

我創建了繼承模式進入兩個新類:ValueError異常與Django管理多表繼承

class Entry(models.Model): 
    LANGUAGE_CHOICES = settings.LANGUAGES 

    language = models.CharField(max_length=2, verbose_name=_('Comment language'), choices=LANGUAGE_CHOICES) 
    user = models.ForeignKey(User) 
    country = models.ForeignKey(Country, null=True, blank=True) 

    created = models.DateTimeField(auto_now=True) 

class Comment(Entry): 
    comment = models.CharField(max_length=2000, blank=True, verbose_name=_('Comment in English')) 

class Discount(Entry): 
    discount = models.CharField(max_length=2000, blank=True, verbose_name=_('Comment in English')) 
    coupon = models.CharField(max_length=2000, blank=True, verbose_name=_('Coupon code if needed')) 

增加這些新車型後通過admin.site.register試圖當我得到ValueError異常爲admin通過管理員創建評論或折扣。添加條目工作正常。

錯誤消息:

ValueError異常在/管理/評論/折扣/添加/ 無法分配 「 ''」: 「Discount.discount」 必須是一個 「折扣」 的實例。 請求方法:GET 請求URL:http://127.0.0.1:8000/admin/reviews/discount/add/ 異常類型:ValueError異常 異常值:
不能分配 「 ''」: 「Discount.discount」 必須是一個 「折扣」 的實例。 異常地點:/Library/Python/2.6/site-packages/django/db/models/fields/related.py在設置,線211 Python的可執行文件:在/ usr/bin中/ Python的 Python版本:2.6.1

+0

您可以粘貼/ dpaste您的視圖代碼,試圖保存模型和完整的回溯? – 2010-05-15 18:52:00

+0

回溯:http://dpaste.com/195193/ 我在Django admin中的「添加折扣」時收到了這個問題。嘗試通過shell創建新的折扣時出現相同的錯誤(折扣= Discount()) – jorilallo 2010-05-16 09:11:55

回答

5

這樣做的原因時出現的錯誤是因爲我用相同的列名已經與型號名稱一起使用。卡倫T.貢獻了以下的答案在Django mailing list

這個問題似乎是你有 名爲場在您的評論的模型 具有相同的名稱,只有小寫。 評論繼承自Entry,使用 多表繼承。這會在 條目中添加 OneToOneField,其副作用爲 向Entry添加'comment'屬性。 這是一個可以讓你 訪問與 Entry作爲在評論中 OneToOneField的結果相關的評論屬性,並通過 默認情況下它被賦予 相關模型,全部小寫的名字。然後發生

的 問題時評論 模式「繼承的所有 場/項的屬性:繼承了 ‘評論’從 項屬性顯然是壓倒一切的 指定的註釋字段,其 可能。一個錯誤,但它似乎 一直存在,因爲1.0。我沒有做過 任何研究,看它是否一直 報道。

作爲一種變通方法,您可以 名的字段數多於其他的東西型號名稱全部爲小寫,或者您可以在子模型中明確指定 OneToOneField, 指定parent_link = True和 除了型號名稱 之外的所有lowername均爲related_name。

0

Hunch的說,你可以用聲明的Entry類作爲一個抽象的一個做,除非你需要一個Entry作爲一個實際的對象,也

...rest of Entry model here... 
created = models.DateTimeField(auto_now_add=True) ## ONLY set date when created, not every save 

class Meta: 
    abstract = True 

...methods for your model etc... 
+0

我決定使用多表繼承,因爲我需要在一個列表中查詢混合包對象。基於這個文件應該工作: http://docs.djangoproject.com/en/1.1/topics/db/models/#id7 – jorilallo 2010-05-15 14:23:50