【问题标题】:hasattr returns always True for app engine ndb entityhasattr 为应用程序引擎 ndb 实体返回始终 True
【发布时间】:2016-10-16 15:33:01
【问题描述】:

我正在将this answer 应用到我的项目中

这是我的 ndb 实体,is_deleted 稍后添加。

class FRoom(ndb.Model):  
    location = ndb.StringProperty(default="")
    is_deleted = ndb.BooleanProperty(default=False) #added later 
    #other fileds

当我使用 logging.info 打印我的实体时,我有

FRoom(key=Key('FRoom', 5606822106890240), is_deleted=False, location=u'denizli')
FRoom(key=Key('FRoom', 6169772060311552), is_deleted=False, location=u'aydin' )
FRoom(key=Key('FRoom', 6451247037022208), location=u'bursa')

当我做的时候

for froom in frooms:
    logging.info(hasattr(froom, 'is_deleted')) # gives always True

但是当我这样做时:

logging.info(hasattr(froom, 'is_deletedXXX')) #gives me False

我做错了什么?

【问题讨论】:

  • 问题:为什么在FRoom(key=Key('FRoom', 6451247037022208), location=u'bursa') 中没有设置is_deleted,即使您的默认设置为False?
  • 用于软删除控制,获取cls.query(cls.is_deleted == False)结果

标签: python google-app-engine hasattr


【解决方案1】:

这是由于is_deleted 属性设置了default 选项而导致的预期行为:如果未明确设置该属性,数据存储将自动返回该默认值。

来自Property Options 表:

因此,对于您在模型中设置default 选项的属性,检查该属性是否存在是不必要的 - 它始终存在,因此您可以直接执行:

for froom in frooms:
    logging.info(froom.is_deleted)
    # or
    logging.info(getattr(froom, 'is_deleted'))

hasattr(froom, 'is_deletedXXX') 返回 False,因为您在 FRoom 的模型中没有 is_deletedXXX 属性。

【讨论】:

  • 我试了一下,但结果相同,我认为default 在插入值时有效
  • 顺便说一句,如果添加is_deletedXXX = ndb.BooleanProperty() 来建模它也会给我True,我在本地工作
  • 您在创建实体时是否设置了is_deletedXXX?如果是,你会得到 True,如果你不设置,你会得到 False(当然,假设你没有为 is_deletedXXX 设置 default 选项)。
  • 我什至没有创建实体,只是更新模型并检查是否是这种情况......奇怪
  • 更新模型时,现有实体不会自动更新。在管理服务器页面的 Datastore Viewer 中检查实际的实体内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-12
  • 2011-05-09
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多