我对来自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
过滤时,应用此功能的最佳选择是什么?
答案 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()
初始将选择更新前的值