Django JSONField在Postgres上的更新失败,"value too long for type character varying(60)"



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

在SQLite上,一切都可以在本地正常工作,但在PostgreSQL的生产环境中则不然。Django表示,他们的JSONField默认使用jsonb,大约相当于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个字符(:

[
["item_1", 1617706749],
["item_2", 1617706749],
["item_3", 1617706749]
]

错误发生在我尝试保存序列化程序时,类似于:

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

我已经尝试删除所有迁移,manage.py migrate <app_name> zero+使用字段选项。

我还缺少什么

Python 3.8.5;Django 3.1.2;djangorest框架3.12.1;PostgreSQL 12

我不确定它是否能解决您的所有问题,但您犯的一个错误是将combine_items作为data传递给您的序列化程序。它应该是一个dict,其键对应于序列化程序字段名。

serializer = MySerializer(instance, data={"my_jsonfield": combine_items})

在疯狂地检查之后,我在上面的同一函数中发现了一个错误,我修改了MyModelinstance.other_field = "some_large_value"的另一个字段。毫不奇怪,这个字段是models.CharField(max_length=60),也是它试图保存序列化程序时弹出错误的原因。对于我最初认为导致错误的字段,它确实是jsonb,并且已经应用了迁移。

经验教训。

谢谢汤姆的建议!

最新更新