【发布时间】:2021-04-02 21:33:12
【问题描述】:
在以下方面寻求帮助。
我在 Python 3+ 上使用 flask_sqlalchemy。我有一个简单的用户和培训课程;下面的定义。我在 Training 类上有一个混合属性,它将返回一个布尔值,指示用户是否订阅了培训。这在使用 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 实例。但是,当尝试添加“已订阅”时,我遇到了错误,表明我没有传递用户。这是真的,但我不知道该怎么做。你能帮忙吗?
TypeError: is_subscribed() 缺少 1 个必需的位置参数:'user'
谢谢! 斯科特
定义
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
【问题讨论】:
标签: python flask orm flask-sqlalchemy marshmallow