如何在App Engine中将整数字段的默认值设置为id()?
在数据模型中,能不能把某个字段的默认值设置为这个数据模型的id()?
就像这样:
class MyModel(db.Model):
myID = db.IntegerProperty(default=self.id())
desc = db.StringProperty()
3 个回答
0
注意,你可以像这样通过ID进行查询:
entity = MyModel.get_by_id(123)
entities = MyModel.get_by_id([123,456,789])
在实体内部再存一个ID的副本几乎是没必要的。
0
我能想到几种方法(比如继承 db.Model 并重写保存键的属性,或者创建一个自定义属性类来覆盖默认值),但这些方法让我感觉不太好,而且会有一些副作用。
如果我真的需要这样的功能(其实我想不出有什么用处),我会为我的模型创建一个特别的 create
方法,用它来在创建之前预先分配 ID。
class BadModel(db.Model):
my_id = db.IntegerProperty()
@classmethod
def create(model, **kwargs):
id = db.allocate_ids(db.Key.from_path(model.kind(), 1),1)[0]
kwargs['key'] = db.Key.from_path(model.kind(), id)
kwargs['my_id'] = id
return model(**kwargs)
>> e = BadModel.create()
>> e.my_id
2039
3
你不能这样做。你在这里设置的默认值是一个类变量,这意味着在类定义被读取后,所有创建的实例都会使用这个相同的默认值。如果在这个上下文中,self.id()
是有意义的(其实并没有,因为self
是未定义的),你得到的可能是类的ID,然后把它作为默认值赋给所有新的实例。
实际上,ID并不会在实体被写入数据存储之前就被分配,所以原则上你在创建实例的时候是无法知道它的值的。你可以在写入实体之后再把一个属性设置为ID,但实际上你几乎肯定不想这样做。