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__

Django 模型字段可调用默认值不起作用

Django 查询返回空白值

Django 模型字段默认为 Null

在 django 管理模型列表中,为方法的返回值显示“是/否”

即使数据库将 0 存储为字段值,Django 查询集对象也返回 None 而不是 0