2010-01-28 25 views
1

給定一個模型如何創建具有默認值,如果以往任何時候都設置爲null

class Template(models.Model): 
    colour = models.CharField(default="red", blank = True, null=True) 

一個Django模型字段我如何安排它,這樣顏色的任何訪問或者返回存儲在字段中的值,或者如果該字段爲空/空,那麼它會返回紅色?

default=red
就會把「紅」在該領域它首次創建時,但如果它然後編輯成空白,我想訪問它返回的「紅色」,而不是「」

更新:我試過了性能解決方案以下建議,但我使用JSON序列化來實現REST API和特性(如colour)沒有得到連載,連載,並在_colour斷API

回答

0

以下是我結束瞭解決這一問題。

首先一些先決條件:我有現成的代碼訪問這些字段名稱(例如'color'),並且該字段也作爲API的一部分被序列化(通過django-rest-interface)。這些東西都不能改變。

嘗試屬性方法工作正常,但colour不再是一個領域,所以沒有序列化。結果:破API

然後轉移到保存()的解決方案,對每個字段的自定義屬性,它的行爲應該像這樣一起:

class ColourChoices(models.Model): 
    colour1 = models.CharField() 
    colour1.colour_default = "red" 
    colour2 = models.CharField() 
    colour2.colour_default = "blue" 

    def save(self, *args, **kwargs): 
     # force colour fields to default values 
     for f in [ x for x in self._meta.fields if hasattr(x, 'colour_default') ]: 
      if self.__getattribute__(f.attname) == "": 
       self.__setattr__(f.attname, f.colour_default) 
     super(ColourChoices, self).save(*args,**kwargs) 

現在一切工作正常,並根據需要。

此解決方案的唯一問題是,如果默認值發生更改,則無法確定哪些數據庫字段應該更新默認值,哪些只是意外地與舊默認值相同。但對於我的申請,我可以忍受這一點。

1

使用save方法來實現這一點。

def save(self, *args, **kw): 
    if self.colour is None: 
     self.colour= 'red' 
    super(ThisModel, self).save(*args, **kw) 
+0

這改變了存儲的值,這不是我想要發生的 – 2010-01-28 20:32:54

4

您可以改爲創建一個單獨的方法:

def get_colour(self): 
    if not self.colour: 
     return 'red' 
    else: 
     return self.colour 

另一種方法是使用屬性。

http://www.djangoproject.com/documentation/models/properties/

+0

我更喜歡這個解決方案,因爲它不修改模型字段的值。除非您想要修改該字段。 – jathanism 2010-01-28 19:18:42

+0

我無法更改我的代碼以通過get_colour訪問字段 - 因此所有讀取/寫入都必須保持顏色。 屬性看起來像它可以工作。是否有任何簡單的方法來產生大量的重複屬性函數(我有很多的顏色字段在模型中,每個都需要包裝) – 2010-01-28 20:28:38

+0

@Malcolm Box:更好的方式來處理您的許多顏色字段的要求將是有一個具有適當屬性的抽象類,這些屬性在許多模型(顏色和您可能擁有的任何其他模型)之間共享。請參閱:http://docs.djangoproject.com/en/dev/topics/db/models/#id6 – cethegeek 2010-01-28 21:41:38

相關問題