Python 当作为ArrayField()的子级嵌套时,JSONField()无法正确保存
简单的问题:保存时,使用Django 1.9+和PostgreSQL 9.4.6将字段设置为ArrayField(JSONField(…),…)不起作用Python 当作为ArrayField()的子级嵌套时,JSONField()无法正确保存,python,django,postgresql,Python,Django,Postgresql,简单的问题:保存时,使用Django 1.9+和PostgreSQL 9.4.6将字段设置为ArrayField(JSONField(…),…)不起作用 # models.py class Foo(models.Model): bar = ArrayField(JSONField(blank=True, null=True), default=list([])) # app.py ... data = request.data #ie. [{...}, {...}] # variat
# models.py
class Foo(models.Model):
bar = ArrayField(JSONField(blank=True, null=True), default=list([]))
# app.py
...
data = request.data #ie. [{...}, {...}]
# variations that were tested:
# JSON.stringify([{...}, {...}, ...])
# JSON.stringify([JSON.stringify({...}), JSON.stringify({...}), ...]
# any mix of non-JSON.stringified and stringified objects being sent via AJAX
Foo(bar=data)
# error message:
django.db.utils.ProgrammingError: column "bar" is of type \
jsonb[] but expression is of type text[]
LINE 1: INSERT INTO "app_foo" ("bar") VALUES (ARRAY['{"name": ...
^
HINT: You will need to rewrite or cast the expression.
@看来你的评论是正确的。由于JSONField支持列表,因此无需在ArrayField中嵌套JSONField。以下是更新的代码:
# models.py
class Foo(models.Model):
bar = JSONField(default=list([]))
# app.py
...
data = request.data #ie. [{...}, {...}]
Foo(bar=data)
# works!
您是否尝试过
Foo(fooField=data)
其中data
是字典而不是字符串?IEFoo(fooField=json.loads(request.data))
?@Hamms我得到这个错误:TypeError:json对象必须是str,而不是'list'…这就引出了一个问题,如果json必须是'str',那么即使正确保存它也不可能是jsonb[](它将始终是文本[])。如果你尝试类似Foo(fooField={})的东西怎么办
?@Hamms我正试图保存一个JSON对象数组……而不是一个JSON对象,所以这没有意义。@jDo你说得对,如果你能在下面发布一个与我的答案相类似的答案,我将使用它作为默认答案,这样你就可以得到一些分数(我是一个非常新的人,所以我很乐意在需要评分的地方给予评分)我想知道如果我们使用:JSONField(default=list)
vsArrayField(JSONField())
@JoseJorgeLorenzoVila:是的。例如,您可以在数组字段的长度上进行筛选,如.filter(bar_ulen=1)
,但不能在JSONField
上进行筛选。由于这个原因,很不幸,我们无法在数组上嵌套json,因为它并不等同于一个简单的json字段。(但无论如何,这可能是需要更好设计的信号)。