如何去掉 _BaseValue
我在使用自己定义的ndb属性子类,这样我可以给它们添加自己的属性。当我从ndb中获取存储的数据时,我经常(但不是总是)会得到一个叫做_BaseValue的包装器。有没有办法避免返回这些_BaseValue?
目前,当我想使用这些数据时,我得先把它传给一个函数,才能拿到里面的b_val。
请求参数
INFO 2013-02-01 08:15:05,834 debug.py:24] discount_application
INFO 2013-02-01 08:15:05,835 debug.py:24] url_name 10
INFO 2013-02-01 08:15:05,835 debug.py:24] name 10%
INFO 2013-02-01 08:15:05,835 debug.py:24] discount.amount 10
INFO 2013-02-01 08:15:05,835 debug.py:24] discount_type discount
INFO 2013-02-01 08:15:05,836 debug.py:24] free_text_discount
INFO 2013-02-01 08:15:05,836 debug.py:24] discount.currency euro
从数据存储中获取的数据,通过自定义函数打印出来
created _BaseValue(datetime.datetime(2013, 1, 31, 10, 41, 6, 757020))
updated _BaseValue(datetime.datetime(2013, 2, 1, 8, 13, 34, 924218))
name _BaseValue('10%')
active _BaseValue(True)
name_lower _BaseValue('10%')
url_name _BaseValue('10_')
discount_type _BaseValue('free_text_discount')
discount _BaseValue(Discount(amount=0, currency=u'euro'))
free_text_discount _BaseValue('Krijg nu 10% korting')
discount_application _BaseValue(' ')
解析请求参数后的数据
created 2013-01-31 10:41:06.757020
updated 2013-02-01 08:13:34.924218
name u'10%'
active True
name_lower u'10%'
url_name u'10_'
discount_type u'discount'
discount Discount(amount=1000, currency=u'euro')
free_text_discount u''
discount_application u' '
根据我的观察,数据的存储方式并不是随机的,而是我想要的那种。下面是获取同一个实例后数据的样子。还有,存储后的数据显示为discount.discount.amount和discount.discount.currency,而不是简单的discount.amount和discount.currency。
created _BaseValue(datetime.datetime(2013, 1, 16, 14, 29, 52, 457230))
updated _BaseValue(datetime.datetime(2013, 2, 1, 8, 14, 29, 329138))
name _BaseValue('20%')
active _BaseValue(True)
name_lower _BaseValue('20%')
url_name u'20_'
discount_type _BaseValue('discount')
discount _BaseValue(Discount(discount=Expando(amount=2000L, currency='percent')))
free_text_discount _BaseValue(' ')
discount_application _BaseValue('')
操作看起来是这样的
# BaseModel has some default properties and inherits from CleanModel
class Action(BaseModel):
_verbose_name = _("Action")
max_create_gid = gid.ADMIN
max_list_gid = gid.ADMIN
max_delete_gid = gid.ADMIN
# And some additional irrelevant properties
# properties is a module containing custom properties,
# which have some additional properties and functions
discount = properties.StructuredProperty(Discount,
html_input_type="small_structure",
verbose_name=_("Discount"),
help_message=_("Set a minimum discount of 10%% or € 1,00"),
max_edit_gid=gid.ADMIN)
def validate(self, original=None):
return {}
而discount的样子是这样的
# CleanModel has some irrelevant functions and inherits from ndb.Model
class Discount(common_models.CleanModel):
amount = EuroMoney.amount.update(
verbose_name=_("Discount"))
currency = EuroMoney.currency.update(
choice_dict=cp_dict(EuroMoney.currency._choice_dict,
updates={CURRENCY_PERCENT: "%%"}),
max_edit_gid=gid.ADMIN)
2 个回答
0
我不知道这里是不是这样,但我之前也遇到过类似的问题,因为我在本地复制了实体的属性,编辑了这些属性,然后再把它们放回实体里(下面有个例子):
# I had wanted to store a list of strings, so I made this class
# (it was intended to store things like ["a", "b", "c"], etc.
class lists(ndb.Model):
thisList = ndb.StringProperty(repeated=True)
def lets_go():
with ndbclient.context():
# Get the entity I want
entity = ndb.Key(lists, "id").get()
# Put it's existing data into a variable called 'local_list'
local_list = entity.thisList
# Append data to that variable
local_list.append("d")
# Assign the updated list back to the entity property
entity.thisList = local_list
这样做会得到一个像这样的列表:["_BaseValue('a')", "_BaseValue('b')"...],而不是想要的["a", "b"...],这就是问题所在。
我记得在2018年左右的旧版Google Cloud Datastore中,这种做法是可以的。不过现在就会出现这里提到的'_BaseValue'问题。我解决这个问题的方法是直接编辑ndb实体,而不是先在本地复制列表:
def lets_go():
with ndbclient.context():
# Get the entity I want
entity = ndb.Key(lists, "id").get()
# And append data to it directly
entity.localList.append("d")
这样做就能把一个真正的列表(像["a", "b"...])放进实体里。
2
_values这个东西是绝对不应该用的。应该用getattr来代替。
下面是一个循环遍历模型属性的例子:
entity = Model(**kwargs)
for name in entity._properties:
val = getattr(entity, name)