You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 18:40:56