gpt4 book ai didi

python - 重复的 StructuredProperty 中的新实体存储为 _BaseValue

转载 作者:行者123 更新时间:2023-11-28 21:20:51 28 4
gpt4 key购买 nike

我有一个 HUser 模型(派生自 Google 的 User 类),它又包含 0 到 n 个社交帐户实例。这些帐户可以是对 Facebook、Twitter 或 LinkedIn 帐户的引用。我已经构建了一个 Account 模型,并在我的 User 模型中使用 repeated=True 定义了一个 StructuredProperty,就像这样:

class Account(ndb.Expando):
account_type = ndb.StringProperty(required=True, choices=['fb', 'tw', 'li'])
account_id = ndb.StringProperty()
access_token = ndb.StringProperty()
...

class HUser(User):
email = ndb.StringProperty(required=True, validator=validate_email)
created = ndb.DateTimeProperty(auto_now_add=True)
accounts = ndb.StructuredProperty(Account, repeated=True)

如果我只向我的用户添加 Facebook 或 LinkedIn 帐户,一切都会按预期进行。但奇怪的是,每当我添加一个 Twitter 帐户时,我添加到同一用户的所有后续帐户都存储为 _BaseValue(Account()),而不是 Account() 直接。因此,在我尝试获取帐户的页面中,我通常会遇到如下错误:

AttributeError: '_BaseValue' object has no attribute 'account_type'

我读到过这些 _BaseValue 转换是 Google 的 ndb 源代码中的一个错误,但我怎样才能摆脱它呢?目前我正在使用这个糟糕的解决方法来绕过异常:

if type(account) == _BaseValue:
account = account.b_val
logging.warn("WARN: %s account %s was of type _BaseValue..." % (account.account_type, account.account_id))

感谢您的帮助!

最佳答案

您如何访问重复的属性? ndb 模型将属性存储为 _BaseValue 并将“无缝”(不幸的是并非总是如此)转换为您的类型(在 ndb 中称为 UserValue)。因此,您必须注意如何在模型之外存储属性。考虑一下:

myUser = HUser(...)
accounts = myUser.accounts
myUser.put()
accounts[0] # This is a _BaseValue(Account)
myUser.accounts[0] # This is an Account

这是一个 open bug在 ndb 问题跟踪器上。

关于python - 重复的 StructuredProperty 中的新实体存储为 _BaseValue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22184888/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com