如何在App Engine中将整数字段的默认值设置为id()?

0 投票
3 回答
714 浏览
提问于 2025-04-16 23:07

在数据模型中,能不能把某个字段的默认值设置为这个数据模型的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,但实际上你几乎肯定不想这样做。

撰写回答