Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/364.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 Django JSONField在Postgres上的更新失败,原因是:“;值太长,无法更改类型字符(60)";_Python_Django_Postgresql - Fatal编程技术网

Python Django JSONField在Postgres上的更新失败,原因是:“;值太长,无法更改类型字符(60)";

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

这是我第一次问问题,所以我希望我没有违反任何主要规则

在SQLite上,一切都可以在本地正常工作,但在PostgreSQL的生产环境中则不行。Django说,他们的JSONField使用了大约250MB的内存

型号:

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})