2010-11-05 55 views
2

使用pyE版GAE并从db.Model扩展模型,如何获取属性等于None或不存在的实体?在Google App Engine中,如何选择属性不存在的实体?

#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) 

回答

3

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

既然你已经改变MyModel模式,你应该可以解决存储,而不duration财产的是这样的实体:

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

,看一下appengine-mapreduce库来完成这个长时间运行的任务。

+0

我正在寻找一种方法来仅查找缺少持续时间属性的实体。你认为唯一的方法是首先在每个实体上创建持续时间=无?提前致谢。 – Chris 2010-11-05 14:22:44

+1

由于您的实体已正确更新,因此您可以使用Query类从Datastore中获取它们(使用duration = None)。没有这个修复,我认为你只能使用笨重的检查“如果不是entity.duration:..”。 – systempuntoout 2010-11-05 15:22:28

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场创建/编辑实体,但是。

+4

这不是必须的:一旦实体与新定义一起存储,您可以在duration = None上过滤;在他们更新之前,他们也没有新的'has_duration'标志。 – 2010-11-05 14:47:16

+0

啊,我想我稍微误解了这个问题。 – 2010-11-05 15:01:29

相关问题