[英]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.