我有一个模型,其中一个字段通常是空字符串。是否有办法返回(例如)字符串'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'
...}
有办法做到这一点吗?有没有比模型内部更好的方法来实现它?
注意:
答案 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