Как сделать вычисляемые поля в peewee?
Как создать вычисляемое поле в определении модели? Можно ли выполнить расчет внутри сгенерированного SQL-запроса? Следующие fruit_difference
будет членом в модели peewee, которую я хочу достичь.
SELECT
apple_count,
orange_count,
(apple_count - orange_count) fruit_difference
FROM fruit_vendors
1 ответ
Решение
Я думаю, что вам нужно это собственность. Если вы используете встроенное свойство Python, оно будет оцениваться в Python. Если вы хотите сделать это на уровне базы данных, я думаю, вам следует использовать Hybrid Property.
Это хороший пример из документации:
class Interval(Model):
start = IntegerField()
end = IntegerField()
@hybrid_property
def length(self):
return self.end - self.start
@hybrid_property
def radius(self):
return abs(self.length) / 2
@radius.expression
def radius(cls):
return fn.ABS(cls.length) / 2
Замечательно то, что обе реализации радиуса ссылаются на гибридный атрибут длины! При обращении через экземпляр Interval вычисление радиуса будет выполнено в Python. При вызове через класс Interval мы получим соответствующий SQL.