这是我第一次问问题,所以我希望我不要违反任何主要规则。
在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})
在疯狂地检查之后,我在上面的同一函数中发现了一个错误,我修改了MyModel
到instance.other_field = "some_large_value"
的另一个字段。毫不奇怪,这个字段是models.CharField(max_length=60)
,也是它试图保存序列化程序时弹出错误的原因。对于我最初认为导致错误的字段,它确实是jsonb,并且已经应用了迁移。
经验教训。
谢谢汤姆的建议!