ArrayField中的Django JSONField

时间:2016-12-14 03:15:33

标签: python arrays json django postgresql

我在使用带有JSONField的ArrayField插入字段时遇到问题。

models.py

call_user_func()

插入

locations = ArrayField(JSONField(null = True,blank = True), blank=True, null = True)

当我这样做时,我得到了

  

列“locations”的类型为jsonb [],但表达式的类型为text []

     

第1行:...... d“= 2517,”locations“= ARRAY ['{”loc ...

     

提示:您需要重写或转换表达式。

所以我尝试使用以下方式转储它:

location_arr = [{"locations" : "loc1","amount":Decimal(100.00)},{"locations" : "loc2","amount":Decimal(200.25)}]
instance.locations = location_arr
instance.save()

然后我得到了这个

  

第1行:...... d“= 2517,”locations“='[{”loc“:...

     

详细说明:“[”必须引入明确指定的数组维度。

我正在使用:

  1. Django 1.9
  2. Python 2.7
  3. Postgres 9.4.10
  4. psycopg2 2.6.2

5 个答案:

答案 0 :(得分:12)

阵列

首先,让我们仔细查看Postgresql Arrays文档中的这个重要文本。

  

提示:数组不是集合;搜索特定的数组元素即可   数据库错误设计的标志。考虑使用单独的表格   每个项目的行都是一个数组元素。这会更容易   搜索,并可能为大量的更好地扩展   元件。

大多数情况下,你不应该使用数组。

JSONB

JSONB在Django中可用作JSONField类型。该字段比数组字段更具可伸缩性和灵活性,可以更有效地进行搜索。但是,如果您发现自己一直在JSONB字段内搜索上面关于Arrays的声明对JSONB同样有效。

现在你的系统有什么?一个包含JSONB字段的数组。这是一场等待发生的灾难。请规范化您的数据。

小结

  

那么何时使用ArrayField?

在极少数情况下,您不需要搜索该列,也不需要使用该列进行连接。

答案 1 :(得分:2)

我遇到了同样的情况。这是我解决它的方式

<强> models.py

element.props.children

插入

from django.contrib.postgres.fields.jsonb import JSONField as JSONBField
location = JSONBField(default=list,null=True,blank=True)

<强>更新

model_object.location = [{"locations" : "loc1","amount":Decimal(100.00)},{"locations" : "loc2","amount":Decimal(200.25)}]

这对我有用  Django - 2.0.2  Postgres - 9.5  psycopg2 - 2.7.4  python - 3.4.3

答案 2 :(得分:0)

您可以通过使用JSONField作为以list作为根元素的列字段类型来避免此问题。

from django.contrib.postgres.fields import JSONField
class MyDBArray(models.Model):
    array_data = models.JSONField(default=list)

my_db_array = MyDBArray(array_data=[1, 2, 3])
my_db_array.save()

您需要在save方法中验证array_data字段实际上是类似列表的内容。

答案 3 :(得分:0)

此问题已在最新的unreleased version of Django 2.2a1

中修复

pip install Django==2.2a1

PS,我相信它将与版本>= 2.2a1

一起使用

答案 4 :(得分:0)

我猜最简单的方法是将字段从jsonfield数组转换为jsonfield。只需将一个密钥添加到location_arr。

相关主题:ArrayField with JSONField as base_field in Django