Python 在peewee中定义虚拟字段

Python 在peewee中定义虚拟字段,python,python-2.7,orm,peewee,Python,Python 2.7,Orm,Peewee,假设我有一个peewee模型,大致如下所示: class MyModel(peewee.Model): a = peewee.IntegerField() b = peewee.IntegerField() @property def diff(self): return self.a - self.b 我希望向该模型添加一个属性,如下所示: class MyModel(peewee.Model): a = peewee.Integer

假设我有一个peewee模型,大致如下所示:

class MyModel(peewee.Model):
    a = peewee.IntegerField()
    b = peewee.IntegerField()
    @property
    def diff(self):
        return self.a - self.b
我希望向该模型添加一个属性,如下所示:

class MyModel(peewee.Model):
    a = peewee.IntegerField()
    b = peewee.IntegerField()
    @property
    def diff(self):
        return self.a - self.b
这有时是有帮助的;现在,如果
Object
是一个
MyModel
实例,我可以用
Object.diff
轻松检查它的
diff

我不能做的事情如下:

objects = list(MyModel.select().where(MyModel.diff < 17))
另一方面,它可以是一个非常简单的属性,例如

@property
def seven(self):
    return 7
这意味着它通常不能转换为SQL,而应该在从数据库检索结果后对其进行过滤

可能吗

更新 我刚刚发现了peewee playhouse的混合方法/特性。这些部分解决了我的问题

例如,我的
diff
方法可以成为
混合属性
,并按预期工作。我的
复杂的_属性
不能成为一个,或者至少看起来是这样;开始时的
if
条件将持续返回
True
False
,并且不起作用


Peewee可能有更多的魔法藏在那里;我会继续查找并报告我的发现。

听起来像是
hybrid\u财产
将是您要寻找的。这是

至于你的更新,如果你只是在文档中读得更深入一点

@hybrid_property
def radius(self):
    return abs(self.length) / 2

@radius.expression
def radius(cls):
    return fn.ABS(cls.length) / 2
因此,您可以看到相同属性的两个函数,
radius
。在模型实例上调用时,将调用第一个函数。在查询中调用第二个时

你可以写:

@hybrid_property
def complicated_property(self):
    if 17 <= self.a <= 173:
        return a_complicated_math_function(self.a + self.b)
    return another_complicated_math_function(self.a * self.b ** 2)

@complicated_property.expression
def complicated_property(cls):
    # Here you will need to use a CASE statement most likely.
    # If you want to turn it into SQL, you obviously need to know
    # what SQL you want to turn it into...
    return case(
        None,
        (cls.a.between(17, 173), fn.math(fn.more_math(cls.a, 1.23))),
        default=fn.another_complicated_math(cls.a))
@hybrid\u属性
def属性(自身):

如果17,谢谢!我也接受你的批评。。。谢谢你的皮维!