【问题标题】:django malformed array literal:django 格式错误的数组文字:
【发布时间】:2019-07-29 06:16:14
【问题描述】:

我有个小问题:

我有这个模型:

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

我想更新这个字段:

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

但我有这个错误:

Traceback(最近一次调用最后一次):文件 “/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"}}"

我该如何解决?

【问题讨论】:

  • 试试 json.loads(data)
  • 我试过了,但我得到了另一个错误 typeError: The JSON object must be str, bytes or bytearray, not dict
  • 你运行的是什么版本的 Django 和 Postgres?
  • Django 2.1 和 postgres 10
  • 您是否已将 myField 更改为 JSONField 但之后未生成/应用任何迁移?这是以前的不同类型吗?我怀疑数据库字段的类型与模型中声明的类型不同。

标签: python django postgresql django-jsonfield


【解决方案1】:

您必须需要使用 PostgreSQL。 我试过了,它对我有用

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

test = myModel()
test.myField=data
test.save()

【讨论】:

  • 没关系,在Python中"'是可以互换的。
  • 太棒了。我刚才注意到了,你也评论了。
  • 他使用的是postgres,你可以从traceback中看出,而且在cmets中也提到了。
【解决方案2】:

您需要一个myModel 的实例来存储它。例如。类似:

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

我怀疑那里有一些不明显的额外代码,datadict,但你在上面调用save,通常会引发AttributeError。另外我猜在您的原始代码中myModel 不是myModel 的实例,而是模型本身,因此您不能直接对其进行操作,您需要一个代表数据库行的实例。

一旦你有了myModel 的实例,你可以这样做:

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

为了在我的回答中明确这一点,您需要确保数据库字段与模型中声明的字段匹配,检查您是否已生成迁移并将它们应用于所有最新更改。

【讨论】:

  • @marcantoniosofia 你能更新你的问题以反映完整的代码吗?就目前而言,您似乎对模型而不是实例进行操作。
【解决方案3】:

我有这个确切的问题,这篇文章是我能找到的唯一参考。我不确定原因是什么,但我最终通过删除新数据库的迁移脚本来修复它。

如果您遇到此错误,请尝试删除最后几个迁移脚本,直到找到罪魁祸首。或者,您可以像我一样重新开始,它应该会再次起作用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-09
    相关资源
    最近更新 更多