假设虚拟领域我有一个peewee模型看起来或多或少如下:定义在peewee
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))
这是因为MyModel.diff是一个简单的属性,而且可能永远大于17.这不是一个Expression
像MyModel.a < 17
。
将diff
好像是一个字段将是非常好的;因此该API的用户不需要知道具体实现是否具有实际字段a
和b
以及实际字段diff
,或者实际字段a
和diff
以及实际字段是否为虚拟字段。
当然,我的真正意图是使用在某些情况下涉及diff
上呈现的更复杂计算的属性;一个例子是
@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)
在另一方面,它可以是一个非常简单的性质,如
@property
def seven(self):
return 7
这意味着它不能,在一般情况下,被转换为SQL,而是应该过滤从数据库中检索后的结果。
这可能吗?
更新
我刚刚发现peewee剧场的混合方法/属性。这些为我的问题提供了部分解决方案。
例如,我的diff
方法可能会变成hybrid_property
,并按预期工作。我的complicated_property
不能成为一个,或者至少看起来像它;在开始的if
条件将不断地返回True
或False
,并且不会起到函数的作用。
Peewee可能藏有更多的魔法;我会继续寻找并报告我的发现。
谢谢!我也接受你的批评......并感谢peewee! – Bach