2016-03-28 1 views
4

Простой вопрос: установка поля как ArrayField (JSONField (...), ...) с использованием Django 1.9+ и PostgreSQL 9.4.6 не позволяет работа при сохраненииJSONField() не сохраняется должным образом при вложении в качестве дочернего элемента ArrayField()

# 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. 
+0

Вы пробовали 'Foo (fooField = data)' где 'data' - это словарь, а не строка? IE 'Foo (fooField = json.loads (request.data))'? – Hamms

+0

@Hamms Я получаю эту ошибку: TypeError: объект JSON должен быть str, а не «list» ... который задает вопрос, если JSON должен быть «str», то он не может быть jsonb [] даже при сохранении правильно (всегда будет текст []) – imdaveho

+0

что делать, если вы пытаетесь что-то вроде 'Foo (fooField = {})'? – Hamms

ответ

4

@jDO кажется, что ваш комментарий правильный. Нет необходимости встраивать JSONField в ArrayField, поскольку JSONField поддерживает списки. Вот обновленный код:

# models.py 
class Foo(models.Model): 
    bar = JSONField(default=list([])) 

# app.py 
... 
data = request.data #ie. [{...}, {...}] 
Foo(bar=data) 

# works! 
+0

Интересно, существуют ли ограничения/преимущества в виде запросов, которые мы можем использовать, если мы используем: 'JSONField (default = list)' vs 'ArrayField (JSONField())' –

+0

@JoseJorgeLorenzoVila: да. Например, вы можете фильтровать по длине 'ArrayField', например' .filter (bar__len = 1) ', но не на' JSONField'. По этой причине, к сожалению, мы не можем вложить json в массив, поскольку это не эквивалентно простому json-полю. (Но в любом случае это, вероятно, признак того, что нужен лучший дизайн). –