Чтение через объединенный запрос Sqlalchemy Jinja - PullRequest
0 голосов
/ 01 октября 2018

Я пытаюсь отобразить имя доктора из другой таблицы, связанной внешним ключом.Я могу отобразить doctor_id, но не могу отобразить его имя.

Я посмотрел на это решение чтение из объединенного запроса в 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 голосов
/ 01 октября 2018

Вы пытаетесь получить доступ к doctor_id.first_name.Но название отношений doctor.Если вы конвертируете результат запроса в список диктов, то вам также следует сериализовать отношение appointment.doctor, чтобы диктофон выглядел как

{
 id: 12,
 doctor: {
  id: 34
 }
}

Затем вы можете получить к нему следующий доступ:

 <td>{{ a.doctor.first_name }}</td>

Но если вы просто планируете использовать его в шаблоне jinja, то зачем вам сериализовывать объекты?Вместо этого вы можете просто передать результат query.all() в шаблон.Джинджа может напрямую обращаться к объектам 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 %}

Это будет работать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...