Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 当作为ArrayField()的子级嵌套时,JSONField()无法正确保存_Python_Django_Postgresql - Fatal编程技术网

Python 当作为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

简单的问题:保存时,使用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. [{...}, {...}] 
# 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
是字典而不是字符串?IE
Foo(fooField=json.loads(request.data))
?@Hamms我得到这个错误:TypeError:json对象必须是str,而不是'list'…这就引出了一个问题,如果json必须是'str',那么即使正确保存它也不可能是jsonb[](它将始终是文本[])。如果你尝试类似
Foo(fooField={})的东西怎么办
?@Hamms我正试图保存一个JSON对象数组……而不是一个JSON对象,所以这没有意义。@jDo你说得对,如果你能在下面发布一个与我的答案相类似的答案,我将使用它作为默认答案,这样你就可以得到一些分数(我是一个非常新的人,所以我很乐意在需要评分的地方给予评分)我想知道如果我们使用:
JSONField(default=list)
vs
ArrayField(JSONField())
@JoseJorgeLorenzoVila:是的。例如,您可以在
数组字段的长度上进行筛选,如
.filter(bar_ulen=1)
,但不能在
JSONField
上进行筛选。由于这个原因,很不幸,我们无法在数组上嵌套json,因为它并不等同于一个简单的json字段。(但无论如何,这可能是需要更好设计的信号)。