在不影响实例初始化的情况下设置Django模型的setattr行为

时间:2017-11-14 12:58:31

标签: python django django-models

我有一个名为A的模型。当b属性设置为该模型时,我想像这样更新该属性:

# Note that PGJSONField is a field that can store string or json.

class A(models.Model):
    description = PGJSONField(blank=True, null=True)
    def __setattr__(self, key, val):
        if key == 'description':
            val = {'description': val}
        super(A, self).__setattr__(key, val)

这会导致副作用。当我从DB获取模型实例时。如果不是,则将描述密钥设置为dict事件。

>>> a = A.objects.first()
>>> a.description
..: {"description": "lorem ipsum"}

我期望的行为是这样的:

>>> a = A.objects.first()
>>> a.description
..: "lorem ipsum"
>>> a.description = "foo bar"
>>> a.description = {"description": "foo bar"}

我认为在获取模型时我必须通过 _setattr 方法,但我找不到办法。有什么建议吗?

1 个答案:

答案 0 :(得分:0)

尝试这种模型结构,它将使您的存储有效 如果不需要数据安全性

class A(models.Model):
    name      = models.CharField(max_length=50)

class KeyVal(models.Model):
    container = models.ForeignKey(A)
    key       = models.CharField(max_length=240, db_index=True)
    value     = models.CharField(max_length=240, db_index=True)

因此,如果您知道A表中的名称,您可以获得所有键值对,键列表,值列表