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的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 2d827429abfc5d9a815f8bbfd676642162335a10d99d466002dcaeab9665bbe3 |
|
MD5 | c2fa0e2010f704c9cb17726964f1723c |
|
BLAKE2b-256 | 6294b3a6f6becd5d19d28244fe7189f03f809f35570cd19a3b63a8572e8a3de6 |