GAE单体应用升级至Python3.7后无法读写Python2.7存储的Datastore对象
问题解决步骤
1. 修复DRF序列化器的冗余source参数错误
当前抛出的AssertionError是Django REST Framework(DRF)的校验错误,和Datastore跨版本兼容无关:
- 打开定义
AppSerializer的文件,找到所有类似以下的字段定义:name = serializers.CharField(source='name') - 删除冗余的
source='name'参数,修改为:name = serializers.CharField() - DRF 3.9+会严格校验
source参数的必要性,当字段名与source值完全相同时,必须移除该参数。
2. 处理Python2到Python3的Datastore NDB兼容问题
安装正确的NDB库
Python3的GAE不再内置NDB,需要安装官方的Cloud NDB库:
pip install google-cloud-ndb
并更新requirements.txt,添加:
google-cloud-ndb==2.2.1 # 可根据最新稳定版调整
字符串编码兼容
- 确保模型中字符串字段使用
ndb.StringProperty(),而非字节类型字段。Python2中存储的str(字节)在Python3的NDB中会自动转换为Unicode字符串,但如果存在特殊字符,需确保模型定义一致。 - 如果使用了
ndb.TextProperty(),Python3读取时同样会自动处理为Unicode文本,无需额外编码转换。
Pickle序列化对象兼容
如果之前用ndb.PickleProperty()存储了Python2的序列化对象,需在Python3的模型中指定编码参数:
class App(ndb.Model): # 原Python2模型中的pickle字段 serialized_data = ndb.PickleProperty(encoding='latin1')
Python2的pickle默认使用latin1编码序列化字节,Python3读取时必须指定该编码,否则会抛出解码错误。
模型定义一致性
- 确保Python3中的
App模型与Python2中的模型定义完全一致:字段名、字段类型、索引设置等必须一一对应。 - 避免新增或删除字段,否则读取旧数据时会出现字段缺失或不匹配的问题。
3. 验证数据读取
修改完成后,重新部署或运行应用,测试AppList接口:
- 确认DRF的
AssertionError已消失。 - 检查返回的Datastore数据是否完整、字段值是否正确,无编码或类型错误。
内容的提问来源于stack exchange,提问作者Vigneshwaran M
相关产品推荐
相关产品推荐

