如何创建具有默认值的django模型字段(如果设置为null)

时间:2010-01-28 17:40:07

标签: python django django-models

给定模型

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

如何安排它以便对颜色的任何访问都返回存储在字段中的值,或者如果字段为空/ null则返回红色?

default=red
会在首次创建时在字段中显示“红色”,但是如果它被编辑为空白我想访问它以返回“红色”,而不是“”< p>

更新:我尝试了下面建议的属性解决方案,但是我使用JSON序列化来实现REST API,并且属性(例如colour)没有被序列化,并且序列化了_colour打破API

3 个答案:

答案 0 :(得分:4)

您可以改为创建一个单独的方法:

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

另一种方法是使用财产。

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

答案 1 :(得分:1)

使用save方法实现此目的。

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

答案 2 :(得分:0)

以下是我最终解决此问题的方法。

首先是一些先决条件:我有现有代码访问这些字段名称(例如'color'),并且该字段也被序列化(通过django-rest-interface)作为API的一部分。这些都不能改变。

尝试使用属性方法工作正常,但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)

现在一切正常并且符合要求。

此解决方案的唯一问题是,如果默认值发生更改,则无法确定哪些数据库字段应具有更新的默认值,哪些数据库字段偶然与旧默认值相同。但是对于我的申请,我可以忍受这个。