使用postgresql jsonb字段类型的django jsonfield
django-jsonbfield的Python项目详细描述
**注意:**这基本上是django主分支postgres contrib包中jsonb支持的独立版本,针对django 1.9版本。
j现场
----
…类::json field(**options)
存储json编码数据的字段。在python中,数据以其python原生格式表示:字典、列表、字符串、数字、布尔值和“none”。
注意:
postgresql有两种基于json的本地数据类型:``json``和``jsonb``。
它们之间的主要区别在于如何存储和如何查询它们。postgresql的“json”字段存储为json的原始字符串
表示形式,当根据键查询
时必须动态解码。“JSONB”字段是基于JSON的实际结构BR/>存储的,它允许索引。权衡是写入“jsonb”字段时的一小部分额外成本。`` jsonfield``使用``jsonb`.
**此字段仅在PostgreSQL版本至少9.4**上受支持。
查询jsonfield
===
我们将使用以下示例模型::
从django.contrib.postgres.fields导入jsonfield
从django.db导入模型
dog(models.model):
name=models.charfield(max_length=200)
data=jsonfield()
def_uuu str_uu(self):\uu unicode_uu on python 2
返回self.name
fieldlookup::jsonfield.key
key、index和path lookup
=======
==要基于给定的字典键进行查询,只需使用该键作为查找名:
>;>;dog.objects.create(name='rufus',data={
…'品种':'拉布拉多',
…所有者“:{
…”姓名':'鲍勃',
…'其他宠物“:[{
…”名字':'鱼',
…}],
…},
…
>>>gt>gt;dog.dog.objects.create(name='meg',data={'breed':'collie'collie'})dog.objects.filter(data='collie'collie''collie'collie')
>[<;dog:meg>;]
>
>
>
>
>
>
>>
>
>
>
>
>
>
>
>
>
>
:鲁弗斯>;]
如果键是整数,则它将被解释为在
数组中的索引查找:
>;>;dog.objects.filter(数据所有者其他宠物名为“fishy”)
[<;dog:rufus>;]
使用:lookup:`jsonfield.contains`查找。
如果只使用一个键或索引,则使用sql运算符`->;`'。如果使用多个
运算符,则使用``运算符。
。警告::
由于任何字符串都可以是json对象中的键,因此除了
下面列出的任何查找都将被解释为键查找。没有出现任何错误。请格外小心键入错误,并始终检查查询
是否按预期工作。
fieldlookup::jsonfield.包含
…fieldlookup::jsonfield.contained_by
。字段查找::jsonfield.has_key
…fieldlookup::jsonfield.has_any_keys
。fieldlookup::jsonfield.has_keys
:类:`~django.contrib.postgres.fields.jsonfield`共享与
包含相关的查找,并与以下项共享密钥:类:`~django.contrib.postgres.fields.hstorefield`.
-:查找:`contains<;hstorefield.contains>;`(接受任何json,而不是
仅接受字符串字典)
-:查找:`包含由<;hstorefield.contained由>;`(接受任何json
,而不仅仅是字符串字典)
-:查找:`具有关键字<;hstorefield.has\key>;`
-:查找:`具有任何关键字<;hstorefield。has_any_keys>;`
-:查找:`has_keys<;hstorefield.has_keys>;。`
j现场
----
…类::json field(**options)
存储json编码数据的字段。在python中,数据以其python原生格式表示:字典、列表、字符串、数字、布尔值和“none”。
注意:
postgresql有两种基于json的本地数据类型:``json``和``jsonb``。
它们之间的主要区别在于如何存储和如何查询它们。postgresql的“json”字段存储为json的原始字符串
表示形式,当根据键查询
时必须动态解码。“JSONB”字段是基于JSON的实际结构BR/>存储的,它允许索引。权衡是写入“jsonb”字段时的一小部分额外成本。`` jsonfield``使用``jsonb`.
**此字段仅在PostgreSQL版本至少9.4**上受支持。
查询jsonfield
===
我们将使用以下示例模型::
从django.contrib.postgres.fields导入jsonfield
从django.db导入模型
dog(models.model):
name=models.charfield(max_length=200)
data=jsonfield()
def_uuu str_uu(self):\uu unicode_uu on python 2
返回self.name
fieldlookup::jsonfield.key
key、index和path lookup
=======
==要基于给定的字典键进行查询,只需使用该键作为查找名:
>;>;dog.objects.create(name='rufus',data={
…'品种':'拉布拉多',
…所有者“:{
…”姓名':'鲍勃',
…'其他宠物“:[{
…”名字':'鱼',
…}],
…},
…
>>>gt>gt;dog.dog.objects.create(name='meg',data={'breed':'collie'collie'})dog.objects.filter(data='collie'collie''collie'collie')
>[<;dog:meg>;]
>
>
>
>
>
>
>>
>
>
>
>
>
>
>
>
>
>
:鲁弗斯>;]
如果键是整数,则它将被解释为在
数组中的索引查找:
>;>;dog.objects.filter(数据所有者其他宠物名为“fishy”)
[<;dog:rufus>;]
使用:lookup:`jsonfield.contains`查找。
如果只使用一个键或索引,则使用sql运算符`->;`'。如果使用多个
运算符,则使用``运算符。
。警告::
由于任何字符串都可以是json对象中的键,因此除了
下面列出的任何查找都将被解释为键查找。没有出现任何错误。请格外小心键入错误,并始终检查查询
是否按预期工作。
fieldlookup::jsonfield.包含
…fieldlookup::jsonfield.contained_by
。字段查找::jsonfield.has_key
…fieldlookup::jsonfield.has_any_keys
。fieldlookup::jsonfield.has_keys
:类:`~django.contrib.postgres.fields.jsonfield`共享与
包含相关的查找,并与以下项共享密钥:类:`~django.contrib.postgres.fields.hstorefield`.
-:查找:`contains<;hstorefield.contains>;`(接受任何json,而不是
仅接受字符串字典)
-:查找:`包含由<;hstorefield.contained由>;`(接受任何json
,而不仅仅是字符串字典)
-:查找:`具有关键字<;hstorefield.has\key>;`
-:查找:`具有任何关键字<;hstorefield。has_any_keys>;`
-:查找:`has_keys<;hstorefield.has_keys>;。`