我正在尝试显示通过外键链接的另一个表中的医生名字。我可以显示doctor_id,但不能显示他的名字。
我看着这个解决方案 reading from joined query in flask-sqlalchemy 但这与我从另一端进行查询时略有不同,并且不能使用backref值作为参考。我已经删除了不相关的代码。
class Appointment(db.Model):
id = db.Column(db.Integer, primary_key=True)
patient_id = db.Column(db.Integer, db.ForeignKey('patient.id'),
nullable=False)
doctor_id = db.Column(db.Integer, db.ForeignKey('doctor.id'),
nullable=False)
class Doctor(db.Model):
id = db.Column(db.Integer, primary_key=True)
first_name = db.Column(db.String(30), unique=False, nullable=False)
appointments = db.relationship('Appointment', backref =
db.backref('doctor',lazy=True))
和查询
all_appmts = db.session.query(Appointment)
.filter_by(patient_id=id)
.join(Doctor)
result =appointments_schema.dump(all_appmts)
return render_template('patient.html', all_appointments=result.data)
这就是我尝试过的
{% for a in all_appointments %}
<td>{{ a.doctor_id.first_name }}</td>
{% endfor %}
显示的医生姓名应基于该约会的医生ID。
这是棉花糖的一部分。
class AppointmentSchema(ma.Schema):
class Meta:
# Fields to expose
fields = ('id','start_datetime', 'end_datetime', 'title',
'patient_id', 'doctor_id')
appointments_schema = AppointmentSchema(many=True)
答案 0 :(得分:2)
您正在尝试访问doctor_id.first_name
。但是关系的名称是doctor
。如果要将查询结果转换为字典列表,则还应该序列化appointment.doctor
关系,以使字典看起来像
{
id: 12,
doctor: {
id: 34
}
}
然后您可以像这样访问它
<td>{{ a.doctor.first_name }}</td>
但是,如果您只是打算在Jinja模板中使用它,那么对对象进行序列化有什么需要?相反,您可以仅将query.all()
的结果传递给模板。 Jinja可以直接访问python对象并显示数据。因此,请尝试执行此操作,而不要使用result =appointments_schema.dump(all_appmts)
all_appmts = db.session.query(Appointment)
.filter_by(patient_id=id)
.join(Doctor)
return render_template('patient.html', all_appointments=all_aptmts.all())
然后将Jinja模板保持不变
{% for a in all_appointments %}
<td>{{ a.doctor.first_name }}</td>
{% endfor %}
它将起作用