Литерал искаженного массива django:

У меня небольшая проблема:

У меня такая модель:

class myModel(models.Model):
    myField =JSONField()

Я хочу обновить это поле:

data={'rda': {'punti': 0, 'rank': 1, 'pos': 'eq'}}
a =myModel()
a.myField=data
a.save()

но у меня такая ошибка:

Отслеживание (последний вызов последним): файл "/home/hy0/.conda/envs/ciclods_env/lib/python3.7/site-packages/django/db/backends/utils.py", строка 85, в _execute return self .cursor.execute (sql, params) psycopg2.DataError: литерал искаженного массива: "{" rda ": {" punti ": 0," rank ": 1," pos ":" eq "}}"

как я могу это решить?


person marcantonio sofia    schedule 07.03.2019    source источник
comment
попробуйте json.loads (данные)   -  person Shakil    schedule 07.03.2019
comment
Я пробовал, но получаю другой тип ошибки Ошибка: объект JSON должен быть str, bytes или bytearray, а не dict   -  person marcantonio sofia    schedule 07.03.2019
comment
Какие версии Django и Postgres вы используете?   -  person Nobilis    schedule 07.03.2019
comment
Django 2.1 и postgres 10   -  person marcantonio sofia    schedule 07.03.2019
comment
Вы изменили myField на JSONField, но не сгенерировали / не применили какие-либо миграции после этого? Раньше это был другой тип? Я подозреваю, что поле базы данных имеет другой тип, нежели тот, который был объявлен в вашей модели.   -  person Nobilis    schedule 07.03.2019
comment
Я сам решаю эту проблему. Какие-нибудь решения?   -  person jarthur    schedule 17.12.2019


Ответы (3)


Вам необходимо использовать PostgreSQL. Я пробовал пока, у меня работает

data = {  
    'rda':{  
        'punti':0,
        'rank':1,
        'pos':'eq'
    }
}

test = myModel()
test.myField=data
test.save()
person shafik    schedule 07.03.2019
comment
Это не имеет значения, в Python " и ' взаимозаменяемы. - person Nobilis; 07.03.2019
comment
Большой. Я заметил только сейчас, и вы тоже комментируете. - person shafik; 07.03.2019
comment
Тем не менее, он использует postgres, это видно по трассировке, плюс это упоминается в комментариях. - person Nobilis; 07.03.2019

Для этого вам нужен экземпляр myModel. Например. что-то вроде:

myModel.objects.create(myField={'rda': {'punti': 0, 'rank': 1, 'pos': 'eq'}})

Я подозреваю, что там есть какой-то дополнительный код, который не очевиден, data это dict, но затем вы коллируете save на него, что обычно повышает AttributeError. Также я предполагаю, что в вашем исходном коде myModel не является экземпляром myModel, а скорее самой моделью, и поэтому вы не можете работать с ней напрямую, вам нужен ее экземпляр, представляющий строку базы данных.

Когда у вас есть экземпляр myModel, вы можете:

a_model = myModel()
a_model.myField = {'rda': {'punti': 0, 'rank': 1, 'pos': 'eq'}}
a_model.save()

Чтобы прояснить это и в моем ответе, вам необходимо убедиться, что поле базы данных соответствует тому, что указано в вашей модели, проверить, что вы сгенерировали миграции, и применили их для всех ваших последних изменений.

person Nobilis    schedule 07.03.2019
comment
@marcantoniosofia, можете ли вы обновить свой вопрос, чтобы он отражал полный код? В настоящий момент кажется, что вы действуете против модели, а не против экземпляра. - person Nobilis; 07.03.2019

У меня была именно эта проблема, и этот пост - единственная ссылка, которую я смог найти на нее. Я не уверен, в чем причина, но я, наконец, исправил ее, удалив сценарии миграции для новой базы данных.

Если вы столкнулись с этой ошибкой, попробуйте удалить последние несколько сценариев миграции, пока не найдете виновника. В качестве альтернативы, вы можете начать все сначала, как я, и это должно снова сработать.

person jarthur    schedule 17.12.2019