簡體   English   中英

如果設置為null,如何創建具有默認值的Django模型字段

[英]How to create a django model field that has a default value if ever set to null

給定一個模型

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

我該如何安排它,以便對顏色的任何訪問都返回存儲在字段中的值,或者如果該字段為空白/空則返回紅色?

default=red
會在首次創建時將“紅色”放置在字段中,但是如果將其編輯為空白,我想訪問它以返回“紅色”,而不是“”

更新:我嘗試了下面建議的屬性解決方案,但是我正在使用JSON序列化實現REST API,並且屬性(例如colour )沒有被序列化,而_colour序列化_colour破壞API

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

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

另一種方法是使用屬性。

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

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

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

這就是我最終解決此問題的方法。

首先要滿足一些先決條件:我已有訪問這些字段名稱的代碼(例如“ colour”),並且該字段也作為API的一部分進行了序列化(通過django-rest-interface)。 這些事情都不能改變。

嘗試使用properties方法可以很好地工作,除了colour不再是字段,因此不進行序列化。 結果:API損壞

然后移到save()解決方案,以及每個字段上的自定義屬性,其行為應如下所示:

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)

現在一切正常,並按要求進行。

此解決方案的唯一問題是,如果更改了默認值,則無法確定哪些數據庫字段應具有更新的默認值,以及哪些字段與舊的默認值偶然具有相同的顏色。 但是對於我的應用程序,我可以接受。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM