Ошибка InvalidRequestError: ожидаемое выражение SQL, столбец или отображенный объект с использованием hybrid_property

#python #orm #sqlalchemy #properties #hybrid

#python #orm #sqlalchemy #свойства #гибрид

Вопрос:

У меня есть следующий класс модели:

 class ArticleOptionSetModel(db.Model):
    __tablename__ = 'sdt_articles_options_sets'

    id = db.Column(db.Integer, db.Sequence("sdq_articles_options_sets"), primary_key=True)
    article_id = db.Column(db.Integer, db.ForeignKey('sdt_articles.id'), nullable=False)
    option_set_id = db.Column(db.Integer, db.ForeignKey('sdt_options_sets.id'), nullable=False)
    order_num = db.Column(db.Integer, nullable=False)

    def have_options(self, article_id) -> int:
        result = db.session.query(func.count(ArticleOptionSetModel.id))
                                  .join(OptionSetModel, ArticleOptionSetModel.option_set_id == OptionSetModel.id)
                                  .filter(ArticleOptionSetModel.article_id == self.article_id)
                                  .filter(OptionSetModel.option_type == OT_OPTION).one()
        if result[0] > 0:
            return 1
        else:
            return 0
  

Если я попытаюсь использовать эту модель в соединении и извлечь поле:

         result = db.session.query(ArticleModel.id,
                                  ArticleOptionSetModel.have_options)
            .join(ArticleOptionSetModel, ArticleModel.id == ArticleOptionSetModel.article_id)

        return result.all()
  

Я получаю эту ошибку:

sqlalchemy.exc.InvalidRequestError: ожидаемое выражение SQL, столбец или отображенный объект — получено ‘1’

где 1 — это значение, возвращаемое моим методом.

0 или 1, возвращаемые методом, следует рассматривать как результат столбца в запросе вызывающего. Как это возможно сделать?

Ответ №1:

Вы должны вернуть

 select([1])

or select([0]) 
  

для возврата как объект SQL.