Django的JSONField里面ArrayField

我有一个问题插入到使用ArrayField与JSONField里面的字段。

models.py

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

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

当我这样做,我得到了

列“位置”的types是jsonb [],但expression式的types是text []

LINE 1:… d“= 2517,”locations“= ARRAY ['{”loc …

提示:您将需要重写或转换expression式。

所以我试图转储它使用:

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

然后我得到了这个

LINE 1:… d“= 2517,”locations“='[{”loc“:…

详细信息:“[”必须引入显式指定的数组维度。

我在用:

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

数组

首先,让我们仔细看一下Postgresql数组文档中的这个重要文本。

提示:数组不是集合; search特定的数组元素可能是数据库错误devise的标志。 考虑使用一个单独的表格,每行都是一个数组元素。 这将更容易search,并且可能对大量元素更好地扩展。

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

JSONB

JSONB作为JSONFieldtypes在Django中可用。 这个字段比数组字段更具扩展性和灵活性,可以更有效地进行search。 但是,如果您发现自己一直在JSONB字段内search,那么关于Arrys的上述声明对于JSONB同样有效。

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

概括

那么何时使用ArrayField?

在罕见的情况下,当你不需要在那一列进行search时,你不需要使用该列来进行连接。