Python 在peewee中定义虚拟字段
假设我有一个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
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,谢谢!我也接受你的批评。。。谢谢你的皮维!