[英]How to get rid of _BaseValue
I'm using my own subclasses of ndb properties so I can add my own properties to them.我正在使用我自己的 ndb 属性子类,因此我可以向它们添加我自己的属性。 When I retrieve data stored in the ndb, I often (not always) retrieve the data in a _BaseValue wrapper.
当我检索存储在 ndb 中的数据时,我经常(并非总是)检索 _BaseValue 包装器中的数据。 How can I avoid the returning of _BaseValues?
如何避免返回 _BaseValues?
Currently when I want to use the data I have to pass it to a function to get the b_val first.目前,当我想使用数据时,我必须将它传递给一个函数以首先获取 b_val。
Request arguments请求参数
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
Data received from datastore using printed using custom function使用自定义函数打印从数据存储接收的数据
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(' ')
Data after parsing the request arguments解析请求参数后的数据
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' '
As far as I can tell the way the data is stored the way I want or not randomly.据我所知,数据以我想要或不随机的方式存储。 Data after receiving the same instance after putting is shown below.
放置后接收相同实例后的数据如下所示。 Also the data after putting is shown as discount.discount.amount and discount.discount.currency instead of just discount.amount and discount.currency
投放后的数据也显示为 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('')
Action looks like this动作看起来像这样
# 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 {}
And discount looks like this折扣看起来像这样
# 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)
_values should never be used. 永远不要使用_values。 getattr should be used instead.
应该使用getattr代替。
An example for looping through properties of a Model: 遍历模型属性的示例:
entity = Model(**kwargs)
for name in entity._properties:
val = getattr(entity, name)
Don't know if this was the case here, but I had the same problem because I was making local copies of entity properties, editing them, then putting them back in the entity (example below):不知道这里是否是这种情况,但我遇到了同样的问题,因为我正在制作实体属性的本地副本,编辑它们,然后将它们放回实体中(下面的示例):
# 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
This will give you a list like this: ["_BaseValue('a')", "_BaseValue('b')"...] instead of ["a", "b"...], which is the problem.这会给你一个这样的列表:["_BaseValue('a')", "_BaseValue('b')"...] 而不是 ["a", "b"...],这是问题所在.
That actually used to work in the old version of Google Cloud Datastore (in about 2018) if I remember correctly.如果我没记错的话,它实际上曾经在旧版本的 Google Cloud Datastore 中工作(大约在 2018 年)。 However, it now gives the kind of '_BaseValue' problem mentioned in the question here.
但是,它现在给出了问题here中提到的那种“_BaseValue”问题。 This is the way I solved the problem--I edited the ndb entity directly, without making a local copy of the list:
这是我解决问题的方法——我直接编辑了 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")
This will put an actual list (like ["a", "b"...]) into the entity.这会将实际列表(如 ["a", "b"...])放入实体中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.