Django HStore:如何覆盖键值模型字段的__getattr__和__setattr__

时间:2013-11-25 19:57:48

标签: python django json postgresql hstore

通过django-hstore module在Django中使用hstore,我一直在努力。使用hstore的一大优点是它允许将键值存储在字段中,同时在Postgresql中提供合适的索引。 django-hstore(以及hstore)的一大缺点是您只能将值存储为字符串。

为了克服这个问题,我认为覆盖模型字段(hstore.DictionaryField)会很好,这样输入到字段中的任何数据都会自动编码为JSON,并且所有检索到的数据都会自动从JSON解码。我试图通过覆盖__setattr__方法来做到这一点,但这会导致大量错误(当设置字段的所有属性时)。有没有正确的方法来做到这一点?

我到目前为止所做的事情(我在关注设定者的同时评论了吸气剂部分,但留下来展示我的想法):

import simplejson as json

from django.db import models
from django_hstore import hstore


def _unpack_json(value):
    try:
        value = json.loads(value)
    except TypeError:
        pass
    return value


class HStoreJsonDict(hstore.DictionaryField):

    @staticmethod
    def _load_json(value):
        try:
            value = json.dumps(value)
        except Exception as e:
            # Is this needed?
            print(value, e)
            pass
        return value

    # def __getattribute__(self, key):
    #     print('__getattribute__')
    #     value = super(HStoreJsonDict, self).__getattribute__(key)
    #     return _unpack_json(value)

    # def __getitem__(self, key):
    #     print('__getitem__')
    #     value = super(HStoreJsonDict, self).__getitem__(key)
    #     return _unpack_json(value)

    def __setattr__(self, key, value):
        print('__setattr__', key, value)
        value = self._load_json(value)
        return super(HStoreJsonDict, self).__setattr__(key, value)

class TestModel(models.Model):
    name = models.CharField(max_length=64)
    data = HStoreJsonDict(db_index=True)
    objects = hstore.HStoreManager()

    def __unicode__(self):
        return '%s - %s' % (self.name, self.data)

1 个答案:

答案 0 :(得分:1)

在一天结束时,我发现最简单地分叉django-hstore模块并在DictionaryField的{​​{1}}和get_prep_value()方法中进行序列化/反序列化(see here for code)。

对于其他任何想要在使用Django时操纵数据库进入/检索数据的人,我强烈建议在to_python()get_prep_value()上检查Django的文档。