我在使用带有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“:...
详细说明:“[”必须引入明确指定的数组维度。
我正在使用:
答案 0 :(得分:12)
首先,让我们仔细查看Postgresql Arrays文档中的这个重要文本。
提示:数组不是集合;搜索特定的数组元素即可 数据库错误设计的标志。考虑使用单独的表格 每个项目的行都是一个数组元素。这会更容易 搜索,并可能为大量的更好地扩展 元件。
大多数情况下,你不应该使用数组。
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)
答案 4 :(得分:0)
我猜最简单的方法是将字段从jsonfield数组转换为jsonfield。只需将一个密钥添加到location_arr。