簡體   English   中英

從 SQLAlchemy class 到 Z9784E91C7B2657917226BC82ZAFDD6 中的 JSON 返回混合屬性

[英]Return hybrid property from SQLAlchemy class through JSON in Flask

尋求以下幫助。

我在 Python 3+ 上使用 flask_sqlalchemy。 我有一個簡單的用戶和一個培訓 class; 下面的定義。 我在 Training class 上有一個混合屬性,它將返回一個 boolean 指示用戶是否訂閱了培訓。 當使用 Jinja 模板引擎時,這就像一個魅力,因為我可以使用“training.is_subscribed(current_user)”。

{% if training.is_subscribed(current_user) %}
<button type="button" class="btn btn-outline-success" disabled>Subscribed</button> You can no longer join
{% else %} 

但是,現在我也在編寫 API 路由並返回 JSON。 我正在使用一個簡單的 Schema (marshmallow_sqlalchemy) 來序列化 Training 實例。 但是,當嘗試添加“已訂閱”時,我遇到了錯誤,表明我沒有傳遞用戶。 這是真的,但我不知道該怎么做。 你能幫忙嗎?

類型錯誤:is_subscribed() 缺少 1 個必需的位置參數:“用戶”

謝謝! 斯科特

定義

training_subscribers = db.Table('training_subscribers',
    db.Column('subscriber_id', db.Integer(), db.ForeignKey('user.id')),
    db.Column('training_id', db.Integer(), db.ForeignKey('training.id')))

class User(db.Model, UserMixin):

    id = db.Column(db.Integer, primary_key=True)
    email = db.Column(db.String(255), unique=True)

    trainings = db.relationship('Training', secondary=training_subscribers,
                        backref=db.backref('subscribers', lazy='dynamic'))  

class Training(db.Model):

    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(250), nullable=False)

    @hybrid_property
    def is_subscribed(self, user) -> bool:
        return self.subscribers.filter(
            training_subscribers.c.subscriber_id == user.id).count() > 0

class TrainingSchema(SQLAlchemySchema):
    class Meta:
        model = Training
        fields = ("is_subscribed","title", "id")

獲取 JSON 響應的代碼

@mod_trainings.route('/json/bydate/<int:year>/<int:month>/<int:day>', methods=['GET'])
@login_required
def showUpcomingTrainingsJSONByDate(year, month, day):
    trainings = trainingController.getTrainingsAtDate(year, month, day)
    training_schema = TrainingSchema(many=True)
    return jsonify(training_schema.dump(trainings))

def getTrainingsAtDate(year, month, day):
    trainings_q = db.session.query(Training).filter(extract('year', Training.starts_at)==year).filter(extract('month', Training.starts_at)==month).filter(extract('day', Training.starts_at)==day).all()
    return trainings_q

training.is_subscribed實際上不是方法,而是屬性,因此不可調用。 太復雜了。 它是如何工作的,不是調用 function 而是取出 function。 那么當你提到training.is_subscribed時你得到的是is_subscribed(self, user)本身。 所以:

類型錯誤:is_subscribed() 缺少 1 個必需的位置參數:“用戶”

發生了。

那么,我們該怎么辦? 它是如此容易。 過濾數據直到響應 JSON。 使用current_user進行渲染意味着必須能夠從 flask 獲得此信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM