Django 模型:覆盖字段返回值
Posted
技术标签:
【中文标题】Django 模型:覆盖字段返回值【英文标题】:Django Models: Override a field return value 【发布时间】:2012-05-10 02:28:58 【问题描述】:我想知道是否可以在返回字段时覆盖该字段的默认值。假设我有一个模型:
class ModelA(models.Model)
name = models.CharField(max_length=30)
有什么方法可以调用
modela_instance.name
可以返回修改后的值,例如 name + "foo",但是默认情况下,附加 foo 的代码会在模型本身内运行,所以我需要做的就是调用 name 来获取附加值?
我应该详细说明一下,我实际上希望做的是在模型中拥有一个方法:
def get_name(self):
return self.name + " foo"
或类似的,只是希望 get_name 方法覆盖对字段“name”的调用。
【问题讨论】:
【参考方案1】:您为什么要这样做?不确定,但我认为这不是一个好主意.. 但是,您可以使用例如 unicode 方法:
class ModelA(models.Model)
name = models.CharField(max_length=30)
def __unicode__(self):
return "%s : foo" % self.name
调用时只需使用:
modela_instance
或者当 foo 必须是动态的时:
class ModelA(models.Model)
name = models.CharField(max_length=30)
def __unicode__(self):
return "%s : %s" % (self.name, self.make_foo())
def make_foo(self):
return "foo"
或者定义你自己的方法:
class ModelA(models.Model)
name = models.CharField(max_length=30)
def alt_name(self):
return "%s : foo" % self.name
【讨论】:
我的模型名称由一个包含“标签”的字符串组成,例如 ModelB: description 。标签与来自不同模型的属性相关。所以 ModelB: description 表示另一个模型“B”的描述属性。我有一个可以翻译这些标签的方法,但是有很多地方会调用 name 并且将它们全部更改是不切实际的,并且如果 modelb 的 description 属性包含在来自 modelc 的 ag 中,它就不会被翻译因为 ModelB: description 只返回 modelb 描述所持有的字符串标签。【参考方案2】:是的,您可以使用properties 来执行此操作
class ModelA(models.Model)
_name = models.CharField(...)
def set_name(self, val):
self._name = "%s - foo" % val
def get_name(self):
return self._name
name = property(get_name, set_name)
【讨论】:
谢谢,我最终使用了一个稍微不同的方法,现在我使用的是一个只读属性,它返回我的方法而不是 name 字段本身。 另见***.com/questions/3757951/…。基本上,要么使用属性,要么使用__getattr__
(小心!)。以上是关于Django 模型:覆盖字段返回值的主要内容,如果未能解决你的问题,请参考以下文章
Django HStore:如何覆盖键值模型字段的 __getattr__ 和 __setattr__