Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django HStore:如何覆盖键值模型字段';s__getattr__和_setattr___Python_Django_Json_Postgresql_Hstore - Fatal编程技术网

Python Django HStore:如何覆盖键值模型字段';s__getattr__和_setattr__

Python Django HStore:如何覆盖键值模型字段';s__getattr__和_setattr__,python,django,json,postgresql,hstore,Python,Django,Json,Postgresql,Hstore,在Django使用hstore,我的脚都湿透了。使用hstore的一大优势是,它允许将键值存储在字段中,同时在Postgresql中提供适当的索引。django hstore(通常是hstore)的一大缺点是只能将值存储为字符串 为了克服这个问题,我认为最好覆盖model字段(hstore.DictionaryField),这样输入到字段中的任何数据都会自动用JSON编码,检索到的任何数据都会自动从JSON解码。我试图通过重写\uuuu setattr\uuuu方法来实现这一点,但这会导致大量错

在Django使用hstore,我的脚都湿透了。使用
hstore
的一大优势是,它允许将键值存储在字段中,同时在Postgresql中提供适当的索引。
django hstore
(通常是
hstore
)的一大缺点是只能将值存储为字符串

为了克服这个问题,我认为最好覆盖model字段(
hstore.DictionaryField
),这样输入到字段中的任何数据都会自动用JSON编码,检索到的任何数据都会自动从JSON解码。我试图通过重写
\uuuu setattr\uuuu
方法来实现这一点,但这会导致大量错误(当设置字段的所有属性时)。有什么好办法吗

到目前为止我所做的(我在关注二传手的同时注释掉了getter部分,但留下来展示我的想法):


一天结束时,我发现最简单的方法是分叉
django hstore
模块,并将序列化/反序列化放在
字典字段
获取\u prep\u value()
到python()
方法()

对于任何在使用Django时希望在数据库输入/检索时操作数据的人,我强烈建议在和上检查Django的文档

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)