跳转到主要内容

django orm 扩展包的 hstore 模块(将第三方插件组合成一个统一包的集合)。

项目描述

这个库现在已被 弃用,推荐使用 django-hstore

是集成 PostgreSQL 的 hstore 扩展到 Django 的库,

兼容性

  • django: 1.4, 1.5, 1.6

  • python: 2.7 和 3.3+

限制和注意事项

  • PostgreSQL 的 hstore 实现没有类型概念;它存储字符串键到字符串值的映射。这个库不尝试将键或值强制转换为字符串。

  • 使用此包时,hstore 扩展不会自动安装。您必须手动安装它。(为了执行测试,您必须在 template1 数据库上安装 hstore 扩展。)

  • 运行测试时,hstore 扩展必须在 template1 数据库上安装。(简短版本)

运行测试的限制

这个限制影响了问题 #11 和 #12(并且不能通过在 template1 数据库上安装 hstore 以外的其他方法解决)。

完整说明,多谢Florian Demmer

我认为我明白了… oid 是问题,以及它是如何和何时确定的… 以及测试设置的一些细节… 通常这是一个多数据库问题。

在测试 settings.py 中配置了两个数据库,但在运行测试时,当然 Django 会创建新的“test_*”数据库(从“template1”)。然而,最初 Django 会连接到配置的“test”或“test2”数据库中的一个。我不知道是哪一个。但在初始连接时,connect-signal 触发扩展注册,确定 hstore oid 并使用它全局注册扩展。

因此,扩展现在已使用来自“test”或“test2”的oid注册。如果在创建“test”和“test2”之前将hstore扩展添加到“template1”,则不会出现任何问题,因为它们都将从“template1”复制hstore oid。

所以在我这个例子中,我在创建测试数据库时笔记本电脑上没有设置“template1”,因此它们具有不同的hstore oid,并且测试失败。我确实在我的电脑上设置了它,并且测试数据库具有相同的hstore oid,并且测试通过。

那么这意味着什么呢?

使用unique=False通过为每个连接重新加载oid来解决此问题。越想这个问题,这越是一个非常、非常丑陋的解决方案。

我强烈建议在template1上安装hstore以避免异常行为。

该库提供了三个主要类

djorm_hstore.fields.DictionaryField

一个ORM字段,用于在hstore列中存储字符串键/值对的映射。

djorm_hstore.fields.ReferencesField

一个ORM字段,基于DictionaryField构建,用于存储字符串键到django对象引用的映射,类似于ForeignKey。

djorm_hstore.models.HStoreManager

一个ORM管理器,提供了库的大部分查询功能。

注意:预定义的hstore管理器继承了djorm-ext-expressions模块(django orm扩展包的一部分)的所有功能。

用法

最初定义一些示例模型

from django.db import models
from djorm_hstore.fields import DictionaryField
from djorm_hstore.models import HStoreManager

class Something(models.Model):
    name = models.CharField(max_length=32)
    data = DictionaryField(db_index=True)
    objects = HStoreManager()

    def __unicode__(self):
        return self.name

然后您将data字段视为简单的字符串对字典

instance = Something.objects.create(name='something', data={'a': '1', 'b': '2'})
assert instance.data['a'] == '1'

empty = Something.objects.create(name='empty')
assert empty.data == {}

empty.data['a'] = '1'
empty.save()
assert Something.objects.get(name='something').data['a'] == '1'

您可以对hstore字段发出索引查询

from djorm_hstore.expressions import HstoreExpression as HE

# equivalence
Something.objects.filter(data={'a': '1', 'b': '2'})

# subset by key/value mapping
Something.objects.where(HE("data").contains({'a':'1'}))

# subset by list of keys
Something.objects.where(HE("data").contains(['a', 'b']))

# subset by single key
Something.objects.where(HE("data").contains("a"))

您还可以通过使用管理器利用一些数据库端功能

# identify the keys present in an hstore field
>>> Something.objects.filter(id=1).hkeys(attr='data')
['a', 'b']

# peek at a a named value within an hstore field
>>> Something.objects.filter(id=1).hpeek(attr='data', key='a')
'1'

# remove a key/value pair from an hstore field
>>> Something.objects.filter(name='something').hremove('data', 'b')

除了过滤器以及用于检索键或hstore字段值的具体方法外,我们还可以使用注释,然后我们可以根据它们进行过滤。

from djorm_hstore.functions import HstoreSlice, HstorePeek, HstoreKeys

queryset = SomeModel.objects.annotate_functions(
    sliced = HstoreSlice("hstorefield", ['v']),
    peeked = HstorePeek("hstorefield", "v"),
    keys = HstoreKeys("hstorefield"),
)

Psycopg2 hstore注册

如果您出于某种原因必须使用djorm_hstore与未安装hstore扩展的数据库一起使用,则可以通过在数据库配置中将HAS_HSTORE设置为False来跳过hstore注册。

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'name',
        'USER': 'user',
        'PASSWORD': 'pass',
        'HOST': 'localhost',
        'PORT': '',
    },
    'other': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'other',
        'USER': 'user',
        'PASSWORD': 'pass',
        'HOST': 'localhost',
        'PORT': '',
        'HAS_HSTORE': False,
    }
}

如果您这样做,那么不要尝试在此数据库中创建DictionaryField。请务必查看allow_syncdb文档。

项目详情


下载文件

下载适用于您的平台的文件。如果您不确定要选择哪个,请了解更多关于安装包的信息。

源分布

djorm-ext-hstore-0.6.tar.gz (12.0 kB 查看哈希值)

上传时间

由以下赞助

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面