Django-每次查询后修改字段值

时间:2018-07-26 09:29:51

标签: django django-models

我对来自Laravel背景的Django相当陌生。我想在每次查询时修改一个字段值。例如,每次查询firstname @ User时,都返回大写的名字。在Laravel中,这称为Accessors,但是在Django中,访问器显然具有不同的含义。就我而言,我有一个名为Meta的键值表,其中value字段可以是任何类型:

class Meta(models.Model):
    key = models.CharField(max_length=30)
    value = models.TextField()
    model = models.ForeignKey('Model', on_delete=models.CASCADE)

,并在获得值Meta.objects.get(key='foo')之后,我想返回ast.literal_eval(value)将字符串表达式转换为正确的相应类型。我做了一些研究,仅发现以下内容:

  • 创建自定义字段。
  • 使用get_foo_display(self),但这据我所知仅适用于ChoiceField。

每次我通过value查询key过滤时,应用此功能的最佳选择是什么?

2 个答案:

答案 0 :(得分:2)

您可以使用自定义字段,但最简单的方法是使用属性。

class Meta(models.Model):
    value = models.TextField()

    @property
    def converted_value(self):
        return ast.literal_eval(self.value) 

现在,只要需要该转换后的值,就可以访问my_meta.converted_value

答案 1 :(得分:1)

@property是一种好方法,但是如果您将花费大量时间ast.literal_eval并且处理成本很高,则可以改写save方法:

def __init__(self, *args, **kwargs):                                         
    super(Meta, self).__init__(*args, **kwargs)                         
    self.__original_value = self.value

def save(self, **kwargs):
    if self.__original_value != self.value:
        self.value = ast.literal_eval(self.value)
    super(Meta, self).save()

初始将选择更新前的值