appengine:如何检查数据存储区中是否存在实体的属性?

时间:2011-07-06 15:12:02

标签: python google-app-engine google-cloud-datastore

我知道无法向数据存储区查询缺失值(请参阅此question)。

从python代码怎么样?是否可以检查实体属性的值是来自数据存储区还是来自默认值?

用例:

Model Kind_X 有1000个实体。对于属性 Kind_X.my_property

  • 500个实体没有 my_property
  • 400个实体 my_property 为无
  • 100个实体是其他值

我想将 my_property 设置为 ABC 仅适用于那些没有该属性的500个实体。无法修改具有值None的400个实体。

注意:将 my_property 默认设置为 ABC 是不可接受的解决方案。

4 个答案:

答案 0 :(得分:0)

您可以迭代给定类型的所有实体,并使用以下命令以编程方式检查:

entities = Model.all()
for entity in entities :
  if not entity.newproperty :
    print "Hey, this entity is missing something"

如果实体数量很大,则应使用mapreduce库以避免超时。

答案 1 :(得分:0)

使用高级ext.db框架无法做到这一点。您可以使用较低级google.appengine.api.datastore框架检索数据(文档位于文档字符串中)。

为什么你需要区分这两种情况?可能有更好的方法。

答案 2 :(得分:0)

如果您没有大量数据,则可以执行地图缩小并将所需实体的键存储在仅具有包含键的ListProperty的新模型中。 这是一种肮脏的黑客攻击,仅适用于少于5k的实体。它还会创建大量元数据,所以要小心

答案 3 :(得分:0)

from google.appengine.api import datastore

entity_key = 'ag1lbmdlbG1pbmFzd2VicgoLEgRVc2VyGGIM' 
entity = datastore.Get(entity_key)
print 'my_property' in entity