Python Django JSONField在Postgres上的更新失败,原因是:“;值太长,无法更改类型字符(60)";
这是我第一次问问题,所以我希望我没有违反任何主要规则 在SQLite上,一切都可以在本地正常工作,但在PostgreSQL的生产环境中则不行。Django说,他们的JSONField使用了大约250MB的内存 型号:Python Django JSONField在Postgres上的更新失败,原因是:“;值太长,无法更改类型字符(60)";,python,django,postgresql,Python,Django,Postgresql,这是我第一次问问题,所以我希望我没有违反任何主要规则 在SQLite上,一切都可以在本地正常工作,但在PostgreSQL的生产环境中则不行。Django说,他们的JSONField使用了大约250MB的内存 型号: class MyModel(models.Model): my_jsonfield = models.JSONField(default=dict, blank=True) ... 序列化程序: class MySerializer(serializers.Mod
class MyModel(models.Model):
my_jsonfield = models.JSONField(default=dict, blank=True)
...
序列化程序:
class MySerializer(serializers.ModelSerializer):
class Meta:
model = MyModel
fields = ['my_jsonfield']
该字段上的现有数据如下所示(可能已经超过60个字符):
尝试保存序列化程序时出错,类似于:
new_item = ["item_4", 1617708548]
old_item = list(instance.my_jsonfield)
combine_items = {"my_jsonfield" : old_item + new item}
serializer = MySerializer(instance, data=combine_items, partial=True)
if serializer.is_valid():
serializer.save() # <--- ERROR HERE
new_item=[“item_4”,1617708548]
old\u item=list(instance.my\u jsonfield)
合并项目={“我的项目”:旧项目+新项目}
serializer=MySerializer(实例,数据=combine\u项,部分=True)
如果序列化程序.u有效():
serializer.save()#我不确定它是否能解决您的所有问题,但您犯的一个错误是将组合项作为数据传递给序列化程序。它应该是一个dict
,其键对应于序列化程序字段名
serializer = MySerializer(instance, data={"my_jsonfield": combine_items})
在疯狂地检查之后,我在上面的同一个函数中发现了一个bug,我通过instance.other\u field=“some\u large\u value”
修改了MyModel
的另一个字段。毫不奇怪,这个字段是models.CharField(max_length=60)
,它是试图保存序列化程序时出现错误的原因。对于我最初认为导致错误的字段,实际上是jsonb,迁移已经应用
吸取的教训
汤姆,谢谢你的建议 我已经编辑了这篇文章。希望这有帮助。谢谢你的回答。对不起,我打字的时候没注意到。这不是问题,因为serializer.save()在经过验证后出现了错误。这是一个问题,因为您在my_jsonfield
上有blank=True
,这是序列化程序中唯一的字段,您还没有通过它,所以基本上没有什么可验证的。我按照您最初的回答编辑了问题。我一直在向序列化程序传递dict,它在本地工作起来就像一个符咒,所以我仍然怀疑我的模型或序列化程序以外的东西。可能是Django在JSONField上为PostgreSQL配置的。这肯定是您的迁移。我已经删除了它们并迁移回初始版本,但这没有任何效果。你推荐什么?
serializer = MySerializer(instance, data={"my_jsonfield": combine_items})