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

时间:2011-08-08 12:46:08

标签: python google-app-engine

是否可以将数据模型中字段的默认值设置为数据模型的id()?

类似

class MyModel(db.Model):
    myID = db.IntegerProperty(default=self.id())
    desc = db.StringProperty()

3 个答案:

答案 0 :(得分:3)

你做不到。您在那里设置的默认值是在一个类变量中,对于读取类定义后创建的所有实例都是相同的。如果self.id()在这种情况下实际上有意义(它没有; self未定义),你将得到类似于类的id,并将其指定为所有新实例的默认值。

在将id写入数据存储区之前,id实际上并未分配给实体,因此原则上您不能知道实例化时它是什么。您可以在编写实体后将属性设置为id ,但无论如何,您几乎肯定不想这样做。

答案 1 :(得分:0)

请注意,您可以按ID查询:

entity = MyModel.get_by_id(123)
entities = MyModel.get_by_id([123,456,789])

在实体内部存储额外的ID副本几乎肯定是不必要的。

答案 2 :(得分:0)

我可以想到几种方法(子类化db.Model并覆盖保存键的属性,创建一个自定义属性类来覆盖default_value)但是它们让我觉得很脏并且有一些副作用。

如果我确实对这样的东西有用(而且我真的想不到一个),我会为我的模型制作一个特殊的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