如何创建一个django模型字段,使其在设置为null时具有默认值
给定一个模型
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)
现在一切都正常运作,符合要求。
这个解决方案唯一的问题是,如果默认值发生变化,就无法判断哪些数据库字段应该更新默认值,哪些只是恰好和旧默认值颜色相同。不过对于我的应用来说,我可以接受这个问题。