在Google App Engine中,如何选择属性不存在的实体?
在使用Python版本的Google App Engine(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
我觉得通常的做法是给你的模型添加一个布尔值的标志字段,然后根据这个字段来筛选数据。在你的情况下,这个字段可以是这样的:
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
字段。
3
你有一些实体没有 duration
属性(因为索引无法引用它们,所以无法进行过滤),还有一些实体的 duration
设置为 None(可以进行过滤)。
既然你已经修改了 MyModel
的结构,你需要用类似下面的方式来修复那些没有 duration
属性的实体:
entities = MyModel.all()
for entity in entities :
if not entity.duration :
entity.duration = None
entity.put()
可以看看 appengine-mapreduce 库,来完成这个需要长时间运行的任务。