在Google App Engine中,如何选择属性不存在的实体?

时间:2010-11-05 13:57:30

标签: python google-app-engine

使用python版本的GAE并从db.Model扩展模型,如何获取属性等于None或不存在的实体?

#This works
#Fetch 10 entities where duration == 0.0
entities = MyModel.all().filter('duration = ', 0.0).fetch(10)

#This doesn't. How can I do the equivalent?
#Fetch 10 entities where duration == None
entities = MyModel.all().filter('duration = ', None).fetch(10)

2 个答案:

答案 0 :(得分:3)

您的实体没有duration属性(无法过滤,因为索引无法引用它们),实体duration设置为无(可以过滤)。

由于您更改了MyModel架构,因此应该使用以下内容修复存储没有duration属性的实体:

entities = MyModel.all()
for entity in entities :
  if not entity.duration :
    entity.duration = None
    entity.put()

查看appengine-mapreduce库以完成此长时间运行的任务。

答案 1 :(得分:0)

我认为通常的做法是在模型中添加一个布尔标志字段并对其进行过滤。在你的情况下,这就像是

class MyModel(db.Model):
    duration = db.FloatProperty()
    has_duration = db.BooleanProperty(default=False)
    # ... etc ...

然后您可以使用

进行第二次查询
entities = MyModel.all().filter('has_duration = ', False).fetch(10) 

但是,在创建/编辑实体时,您必须注意更新has_duration字段。