Как сделать вычисляемые поля в 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.

Другие вопросы по тегам