Python SDK,往list或dict字段添加新数据项目。以前用python2.7的SDK我经常这样写是可以成功的:

listData = data.get('listKey')
listData.append(newData)
data.save()

现在新项目用python 3 SDK,发现不可以了,必须在save()前再set一下才可以,否则即使像下面例子中print语句所示位置处数据是正确的,但保存后listData字段也未正确更新:

listData = data.get('listKey')
listData.append(newData)
print(data.get('listKey')) # 此时print出的listData是包含有newData新数据的
data.set('listKey', listData)
data.save()

请问这是什么情况?是不是有类似set后才会将该字段设置为dirty才能更新保存的机制?这个情况是python 3和2.7版本SDK的区别、还是现在统一都必须如此操作?
谢谢!

请问有人能帮忙看一下这个问题吗?谢谢!

推荐的做法是用 SDK 提供的 add 方法:

data.add('listKey', newData)

或者像您用 set (listData.append(newData); data.set('listKey', listData))也是可以的(如果数组很大,可能会略微浪费一点网络请求的流量)。

下面这样是不行的,只有本地的 data 会更新,云端的数据不会更新(无论 Python 2 还是 Python 3 下皆是如此)

listData = data.get('listKey')
listData.append(newData)
data.save()

是有类似的机制,必须要通过调用 SDK 的 set 方法(或者 add 之类的类 set 方法),Python 2 和 Python 3 皆是如此。
这和 JS SDK 不一样,JS SDK 的 save 更智能,比如下面的代码在 JS SDK 下会更新云端的数据:

const d = await new AV.Query('TestObject').get('5f27bc73fbb489000824300d')
console.log(d.get('testList'))
listData = d.get('testList')
listData.push('debug')
await d.save()

谢谢!
回想我以前很多情况下python 2 SDK 不再set可以成功保存,可能因为我是用的Redis,被修改的那个数据是从Redis里抓出来生成的,而不是从数据表里查询的。原来是不安全的用法。