简体   繁体   English

如何摆脱_BaseValue

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM