appengine数据存储中的空列表:Java与Python

2024-06-02 09:36:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我在App Engine中有以下java模型类:

public class Xyz ... {
    @Persistent
    private Set<Long> uvw;
}

在Java中保存一个Xyz为空的uvw的对象时,我会得到一个“null”字段(如appengine datastore viewer中所列)。 当我尝试在Python中加载同一对象时(通过remote_api),如以下Python模型类所定义:

^{pr2}$

我得到一个“BadValueError:Property uvw is required”。在

当用一个空的uvw列表在Python中保存同一类的另一个对象时,Datastore viewer会打印一个“缺少”字段。在

显然,空列表存储处理在Java和Python之间有所不同,并导致对象“不兼容”。在

因此,我的问题是:有没有办法:

  • 强制Java将空列表存储为“missing”字段
  • 强制Python在加载对象时优雅地接受“null”列表为空列表?

或者关于如何处理两种语言中的空列表字段的任何其他建议。在

谢谢你的回答!在


Tags: 对象模型app列表javaprivatepublicviewer
3条回答

Java的Set行为是因为Java的集合是引用类型,默认为null。在

要实际创建一个空集,请如下声明:

@Persistent
private Set<Long> uvw = new HashSet<Long>();

或者在右侧使用^{}的其他实现。^{}是最常用的集合类型。其他有趣的集类型是两个线程安全集^{}^{};还有有序集类型^{}和排序集类型^{}。在

如果为Python属性指定一个默认值,则应该可以使用:

uvw = db.ListProperty(int, default=[])

我使用低级的javaapi,所以我所做的可能会有所不同。但在将集合类型的数据结构保存到数据存储之前,我将其转换为数据存储自然处理的内容。这将主要包括字符串和bytearray。在

听起来像是javaappengine将空集解释为空值。python没有正确地读取这个空值。您可以尝试将空集保存为字符串值“empty set”。然后让python检查数据存储是否包含该字符串值。如果有,它可以分配一个新的空集;如果没有,它可以将属性作为一个集来读取。在

相关问题 更多 >