返回django模型上空字段的默认值

时间:2015-02-03 03:43:47

标签: django

我有一个模型,其中一个字段通常是空字符串。是否有办法返回(例如)字符串'default'而不是该模型上的查询的空字符串?

class MyModel(models.Model):
    ...
    afield = models.CharField(...)  # many rows set afield to ''

当我执行查询时

o = MyModel.objects.all()
vars(o[0])
{...
'afield': ''  # afield is empty
...}

我宁愿看

vars(o[0])
{...
'afield': 'default'
...}

有办法做到这一点吗?有没有比模型内部更好的方法来实现它?

注意:

  • 我不想存储字符串'default'
  • this answer改变了数据库,我想避免使用

2 个答案:

答案 0 :(得分:3)

您可以覆盖__getattribute__()方法:

class MyModel(models.Model):
    ....
    def __getattribute__(self, name):
        attr = models.Model.__getattribute__(self, name)
        if name == 'afield' and not attr:
            return 'default'
        return attr

以下是用法:

>>> obj = MyModel()
>>> obj.afield
'default'
>>> getattr(obj, 'afield')
'default'
>>> obj.afield = 'test'
>>> obj.afield
'test'
>>> getattr(obj, 'afield')
'test'
>>> obj.afield = ''
>>> obj.afield
'default'
>>> # other properties work as usual
>>> obj.some_var = 123
>>> obj.some_var
123

答案 1 :(得分:1)

作为逻辑的一部分,在视图中处理此问题可能更好,很多 更好,但您可以使用属性和设置器来执行此操作:

class MyModel(models.Model):
    _afield = models.CharField(...)
    @property
    def afield(self):
        if self._afield:
            return self._afield
        else:
            return "default"

    @afield.setter
    def afield_setter(self,value):
        self._afield = value