2010-05-26 95 views
2

經過多年的PHP編程,我正在開發我的第一個真正的Django項目,並且我遇到了模型問題。首先,我注意到,我被複制和模型之間粘貼代碼,併成爲一個勤奮OO程序員,我決定做,其他車型也繼承父類:幫助一個Django模型繼承問題的Python新手

class Common(model.Model): 
    name = models.CharField(max_length=255) 
    date_created = models.DateTimeField(auto_now_add=True) 
    date_modified = models.DateTimeField(auto_now=True) 

    def __unicode__(self): 
     return self.name 

    class Meta: 
     abstract=True 

到目前爲止好。現在我所有的其他模型都擴展爲「Common」,並且具有我想要的名稱和日期。但是,我有一個「類別」類名稱必須是唯一的。我認爲應該有一個相對簡單的方法來訪問Common中的name屬性並使其具有唯一性。但是,我嘗試使用的不同方法都失敗了。例如:

class Category(Common): 
    def __init__(self, *args, **kwargs): 
     self.name.unique=True 

原因Django管理頁面吐了錯誤「,而渲染捕獲的異常:‘分類’對象有沒有屬性‘名’

有人能指出我在正確的方向?

回答

2
+0

我有點震驚地看到,在文檔中,這似乎是一個相當大的遺漏! – Joshmaker 2010-05-26 16:48:08

+0

那麼,模型繼承在Django中完全缺失了一段時間,所以我認爲這是一個很大的改進。我不完全確定,但我認爲你可以在自定義管理器中實現unique = true。或者,您可能可以使用多重繼承,並將UNIQUE_NAME作爲混合使用。 – gomad 2010-05-26 17:06:32

1

您的Common類小錯

class Common(model.Model): 
    self.name = models.CharField(max_length=255) 

應該

class Common(model.Model): 
    name = models.CharField(max_length=255) 
+1

認爲必須是複製粘貼問題,因爲它不是有效的Python - self在此時未被定義。 – 2010-05-26 15:42:16

+0

抱歉,關於錯字的混淆。由於我是Python的新手,我一直在嘗試使用很多奇怪的代碼來看看會發生什麼,這是我在粘貼到Stackoverflow之前要清理的一個實驗。 不幸的是,即使刪除了錯字,我的代碼也無法正常工作 – Joshmaker 2010-05-26 16:11:00

0

嘗試使用Meta.unique_together迫使它進入了自己獨特的指數。否則,創建兩個單獨的抽象類可能是最簡單的,一個是字段唯一,另一個不是。

1

請注意,UNIQUE約束實際上與Django無關,所以您可以自由地將它添加到數據庫表中。您也可以使用post-syncdb鉤子。