如何在PeeWee模型中创建动态生成的价值?

时间:2018-07-19 16:23:42

标签: python peewee

到目前为止,在我使用的ORM中,有一个选项可以向模型添加值(字段?),该值未存储在数据库中,而是使用其他值构造的。

这是一个简短的示例:

class MediaFile(BaseModel):
    ID = IntegerField()
    FileName = str(ID) + ".jpg"

因此,有ID存储在数据库中,而FileName是由ID构造的。上面的示例当然在PeeWee中不起作用,因为IDIntegerField,而不是我需要的int

我如何在PeeWee中做这样的事情?怎么称呼?

1 个答案:

答案 0 :(得分:1)

好吧,如果您只想访问存储在数据库中的不是的属性,请记住,peewee模型只是Python类:

Collision& Player::getCollisionObject()
{
    return m_CollisionBody;
}

有关希望同时用作SQL构造和计算实例值的更复杂的操作,请参见hybrid properties。使用混合属性的示例:

class MediaFile(BaseModel):
    ID = AutoField()  # You should probably use this for auto-inc IDs.

    @property
    def FileName(self):
        return str(self.ID) + '.jpg'

通过此混合属性和混合方法,我们可以在模型实例的SQL查询中使用这些属性。因此,我们最终能够执行以下操作:

class Interval(Model):
    start = IntegerField()
    end = IntegerField()

    @hybrid_property
    def length(self):
        return self.end - self.start

    @hybrid_method
    def contains(self, point):
        return (self.start <= point) & (point < self.end)

将生成以下SQL:

query = Interval.select().where(Interval.contains(2))

但是我们也可以这样做:

SELECT "id", "start", "end"
FROM "interval" AS t1
WHERE (("start" <= 2) AND (2 < "end"))