0

该手册没有示例如何使用 db.allocate_id_range。我尝试了一些代码,但它失败了,尤其是 webapp2:s 用户模型,它是一个 ndb expando 模型。我想要做的只是创建一个具有我选择的 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

我做错了吗?我还尝试将模型名称放在引号中,但这也不起作用。我应该怎么做?感谢您的任何建议。

4

1 回答 1

2

您应该能够使用ndb.allocate_ids函数来实现相同的功能。

如果您比较db.allocate_id_rangendb allocate_ids实现,您会发现它们都是底层数据存储区allocate_ids RPC 的包装器。

如果你想用 NDB 模仿 allocate_id_range 你应该做类似的事情:

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()

甚至更简单(如在文档中,guido 在评论中指出):

start_id, end_id = Foo.allocate_ids(max=3001)
if start_id <= 3001:
    Foo(id=3001).put()
于 2012-02-07T18:18:16.077 回答