首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django HStore:如何覆盖键值模型字段的__getattr__和__setattr__

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

Stack Overflow用户
提问于 2013-11-25 19:57:47
回答 1查看 1.1K关注 0票数 2

通过模块,我一直在使用Django的hstore来弄湿我的脚。使用hstore的一个巨大优点是它允许将键值存储在字段中,同时在Postgresql中提供良好的索引。django-hstore (和一般的hstore )的一个很大的缺点是,您只能将值存储为字符串。

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

到目前为止,我已经做了些什么(我已经评论掉了getter的部分,而专注于setter,但留下它来展示我的想法):

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-27 22:13:01

最后,我发现分叉django-hstore模块并将序列化/反序列化放在DictionaryFieldget_prep_value()to_python()方法(请看这里的代码)中是最简单的。

对于在使用Django时希望在从数据库输入/检索数据的其他人,我强烈建议在python()值()上检查Django的文档。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20202082

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档