Используете db.allocate_id_range? - PullRequest
0 голосов
/ 07 февраля 2012

В руководстве нет примера использования db.allocate_id_range.Я попробовал некоторый код, но он не удался, особенно для пользовательской модели webapp2: s, которая является моделью ndb expando.То, что я хочу сделать, это просто создать сущность User с выбранным номером ID, поэтому я пытаюсь использовать db.allocate_id_range, но он не работает:

BadArgumentError: Expected an instance or iterable of (<class 'google.appengine.
ext.db.Model'>, <class 'google.appengine.api.datastore_types.Key'>, <type 'bases
tring'>); received User<address=StringProperty('address'), auth_ids=StringProper
ty('auth_ids', repeated=True), created=DateTimeProperty('created', auto_now_add=
True), firstname=StringProperty('firstname'), lastname=StringProperty('lastname'
), notify=BooleanProperty('notify', default=False), notify_sms=BooleanProperty('
notify_sms', default=False), password=StringProperty('password'), phone_cell=Str
ingProperty('phone_cell'), registered=BooleanProperty('registered', default=Fals
e), sponsor=KeyProperty('sponsor'), updated=DateTimeProperty('updated', auto_now
=True)> (a MetaModel).

То, как я пытаюсь это сделать, похоже наэто

first_batch = db.allocate_id_range(User, 3001, 3001) #try allocate ID 3001

Я делаю это неправильно?Я также попытался поместить название модели в кавычки, но это тоже не сработало.Как я должен это делать?Спасибо за любой совет.

1 Ответ

2 голосов
/ 07 февраля 2012

Вы должны иметь возможность использовать функцию ndb.allocate_ids для достижения той же функциональности.

Если вы сравните реализацию db.allocate_id_range и ndb allocate_ids , вы увидите, что они оба являются оберткой для базового хранилища данных allocate_ids RPC.

Если вы хотите имитировать allocate_id_range с NDB, вы должны сделать что-то вроде:

ctx = tasklets.get_context()
model.Key('Foo', 1) # the id(1) here is ingnored
start_id, end_id = ctx.allocate_ids(key, max=3001) # allocate all ids up to 3001
if start_id <= 3001:
    # it is safe to use 3001
    Foo(id=3001).put()

Или даже проще (как в документе, Гвидо указал в комментарии):

start_id, end_id = Foo.allocate_ids(max=3001)
if start_id <= 3001:
    Foo(id=3001).put()
...