通读联接查询Sqlalchemy Jinja

时间:2018-10-01 03:06:36

标签: python sqlalchemy jinja2

我正在尝试显示通过外键链接的另一个表中的医生名字。我可以显示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)

1 个答案:

答案 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 %}

它将起作用