如何创建一个django模型字段,使其在设置为null时具有默认值

1 投票
3 回答
2049 浏览
提问于 2025-04-15 18:36

给定一个模型

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

我该怎么做才能确保每次访问颜色时,要么返回存储在字段中的值,要么如果字段是空的,就返回红色?

这个

default=red
会在字段第一次创建时放入“红色”,但是如果之后被编辑成空白,我希望访问它时返回“红色”,而不是空字符串“”。

更新:我尝试了下面建议的属性解决方案,但我正在使用JSON序列化来实现一个REST API,而这些属性(比如colour)不会被序列化,序列化_colour又会破坏API。

3 个回答

1

使用 save 方法来实现这个功能。

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

你可以创建一个单独的方法来解决这个问题:

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

另外一种方法是使用属性。

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

0

这是我解决这个问题的方法。

首先,有一些前提条件:我有现成的代码在使用这些字段名(比如说'colour'),而且这个字段也通过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)

现在一切都正常运作,符合要求。

这个解决方案唯一的问题是,如果默认值发生变化,就无法判断哪些数据库字段应该更新默认值,哪些只是恰好和旧默认值颜色相同。不过对于我的应用来说,我可以接受这个问题。

撰写回答