3

私は独自の 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後、同じインスタンスを受け取った後のデータを以下に示します。また、入れた後のデータは、単に割引額と割引.通貨ではなく、割引.割引額と割引.割引.通貨として表示されます

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

そして割引はこんな感じ

# 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)
4

2 に答える 2

2

_values は使用しないでください。代わりに getattr を使用する必要があります。
モデルのプロパティをループする例:

entity = Model(**kwargs)
for name in entity._properties:
    val = getattr(entity, name)
于 2013-07-19T19:20:42.523 に答える
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 

これにより、問題である ["a", "b"...] ではなく ["_BaseValue('a')", "_BaseValue('b')"...] のようなリストが得られます。 .

私の記憶が正しければ、実際には古いバージョンの Google Cloud Datastore (約 2018 年) で機能していました。ただし、ここでの質問に記載されている「_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"...] など) がエンティティに挿入されます。

于 2021-11-17T13:18:15.863 に答える