Google Cloud Datastore中IntegerProperty能否设默认值为None?
关于Google Cloud Datastore ndb中IntegerProperty设置默认值为None的问题
当然可以把IntegerProperty的默认值设为None,而且完全支持你提到的query.add_filter('age', '=', None)这类查询操作——和StringProperty的用法完全一致。
在ndb的设计逻辑里,不管是数值类型还是字符串类型的属性,只要你把default参数明确设为None,当创建实体时如果没有给该属性赋值,Datastore就不会在实体中存储这个属性(等价于存储为缺失值)。这时候用= None的过滤条件,就能精准查询到所有没有设置age属性的实体,和StringProperty的表现没有区别。
给你一个完整的可运行示例:
from google.cloud import ndb class User(ndb.Model): age = ndb.IntegerProperty(default=None) name = ndb.StringProperty(default=None) # 测试代码 if __name__ == "__main__": client = ndb.Client() with client.context(): # 创建两个用户:一个指定年龄,一个使用默认的None alice = User(name="Alice", age=30) alice.put() bob = User(name="Bob") # age自动使用默认值None,实体中不会存储age属性 bob.put() # 执行查询:找出age为None的用户 age_none_query = User.query(User.age == None) # 或者用你习惯的add_filter写法: # age_none_query = User.query().add_filter('age', '=', None) results = age_none_query.fetch() # 输出结果应该只有Bob for user in results: print(f"找到用户: {user.name},年龄未设置")
这里有个小细节需要注意:如果你不小心把默认值设成了非None的数值(比如default=0),那未赋值的实体的age属性会被存储为0,这时候用= None就查不到这类实体了,所以一定要确保default参数明确设为None。
另外,Datastore里的缺失值逻辑和SQL的NULL类似,= None会匹配所有没有该属性或者属性值明确为None的实体——而通过default=None创建的未赋值实体,刚好属于前者,完全符合你的查询需求。
内容的提问来源于stack exchange,提问作者Roy Yin
相关产品推荐
相关产品推荐

