Skip to main content
 首页 » 编程设计

python之如何摆脱 _BaseValue

2025年05月04日11sxdcgaq8080

我正在使用自己的 ndb 属性子类,因此我可以向它们添加自己的属性。 当我检索存储在 ndb 中的数据时,我经常(并非总是)在 _BaseValue 包装器中检索数据。如何避免返回 _BaseValues?
目前,当我想使用数据时,我必须将其传递给一个函数以首先获取 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' ' 

据我所知,数据是按照我想要的方式存储的,或者不是随机存储的。 put后收到同一个实例后的数据如下图。此外,放置后的数据显示为 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 看起来像这样

# 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 {} 

打折是这样的

# 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 不应该被使用。应该改用 getattr。
循环模型属性的示例:

entity = Model(**kwargs) 
for name in entity._properties: 
    val = getattr(entity, name)