检查Google App Engine数据存储实体是否具有特定属性。

4

我刚开始使用Google App Engine进行Web应用程序开发。

我想要检查我的数据存储中的实体是否具有设置为空的列表属性(db.ListProperty)。然而,当我尝试检查任何与entity.list相关的内容时,GAE会出现错误:

'super' object has no attribute 'list'

经过一番搜索,我在这个SO问题中看到,将GAE数据存储实体的列表属性设置为空值等效于根本不设置该属性。这就解释了我的错误。

因此,我需要匹配数据存储中没有设置任何list属性的实体。查看GAE文档后,我仍然没有找到任何允许我检查实体是否具有特定属性设置的方法。

注意:我不必使用GQL完成这个任务。我可以使用GQL检索所有实体,然后再使用Python进行检查。但使用GQL解决方案也可以。


你能发布你的模型吗?另外根据文档,“ListProperty的值不能为None。但是,它可以是一个空列表。当默认参数指定为None(或者未指定默认参数)时,属性的默认值是空列表。”我尝试了一下,确实会创建一个值为[]的ListProperty。另一方面,你不能查询两个列表是否相等,所以唯一的解决办法就是查询所有元素并在Python中进行过滤。 - Sebastian Kreft
是的,我所说的空值指的是空列表。 - Abhranil Das
我预计实体中会有一个空的“list”元素。除非该实体最初是由没有列表元素的模型创建的,否则我真的不明白为什么你根本没有列表元素。 - dragonx
如果您跟随我的问题中的链接,您会发现在gae数据存储中根本不会存储空列表元素,即使模型有一个列表元素,这是由于实体存储方式的原因。这就像根本没有设置任何属性一样。 - Abhranil Das
3个回答

15

我能想到三种解决方法。

你遇到这种情况可能是因为最初你的模型没有'list'属性,而后来你添加了该属性,所以你可能有早期的实例在数据存储中没有'list'属性。你可以编写一个mapreduce功能,通过数据存储确保所有实体都具有'list'元素。

另外,你可以使用python的hasattr函数。

if hasattr(entity, 'list'):
    a = entity.list[0] # or whatever operation you want

第三,您可以使用异常处理程序捕获错误情况。


1
+1. 我的情况并不是第一位,真的。解决方案2听起来不错。我会尝试一下,希望它能够奏效,然后我会接受这个答案。 - Abhranil Das

2

在GQL中没有这样的方法,它只能过滤现有值。相反,您应该使用某种计算属性。NDB支持这些,或者您可以覆盖_pre_put钩子,使其他一些属性设置为列表长度,以便您可以查询新属性== 0。


0

@dragonx写的完全没问题。根据我的经验,最好使用try-except语句:

for q in query:
    try:
        q.someattribute
    except AttributeError:
        setattr(q, 'someattribute', True)  # or whatever operation you need

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接