Вывести список всех адресов найденных по человеку

Использую Flask. У человека может быть несколько адресов (домашний, рабочий, адрес места регистрации). Адреса лежат в отдельной таблице (address). И в таблице physical_person и address есть общий идентификатор (subject_id). Создал связь 1 ко многим. При поиске человека все отображается хорошо, то есть если я не вбиваю дату рождения он выводит мне всех людей у кого есть такая комбинация ФИО, если вбиваю дату рождения он выводит определенного человека. Но вот когда я хочу получить регион из списка адресов, он ничего не выдает. Подскажите пожалуйста, как в Jinja2 вывести весь список адресов для человека c определенными условиями? Форма классов models.py:

  class PhysicalPerson(db.Model):
    __tablename__ = 'physical_person'

    subject_id = db.Column(db.String(20), primary_key=True, unique=True, index=True)
    last_name = db.Column(db.String(50))
    first_name = db.Column(db.String(25))
    middle_name = db.Column(db.String(25))
    sex = db.Column(db.String(1))
    birth_date = db.Column(db.DateTime)
    birth_place = db.Column(db.String(50))
    person_e_mail = db.Column(db.String(50))
    person_document_type = db.Column(db.Integer)
    person_document_seria = db.Column(db.String(15))
    person_document_number = db.Column(db.String(20))
    person_document_vydan_date = db.Column(db.DateTime)
    person_document_vydan = db.Column(db.String(300))
    staz = db.Column(db.DateTime)
    black_label = db.Column(db.Integer)
    notes = db.Column(db.String(200))
    inn = db.Column(db.String(12))
    addresses = db.relationship('UserAddress', backref='address', lazy='dynamic')
    user_id = db.relationship('PortalUsers', backref='id', uselist=False)

    def __repr__(self):
        return '<Person: {} - ' \
               ' {} {}' \
               ' {} {}'.format(self.subject_id, self.last_name, self.first_name, self.middle_name, 
                               self.birth_date, self.addresses)


class UserAddress(db.Model):
    __tablename__ = 'address'

    address_id = db.Column(db.String(10), primary_key=True, unique=True, index=True, nullable=False)
    subject_id = db.Column(db.String(20), db.ForeignKey('physical_person.subject_id'))
    zip = db.Column(db.String(10))
    country = db.Column(db.String(50))
    state = db.Column(db.String(50))
    city = db.Column(db.String(100))
    street = db.Column(db.String(500))
    house_number = db.Column(db.String(10))
    apartment_number = db.Column(db.String(30))
    address_type = db.Column(db.Integer, nullable=False)
    address_preferred_flag = db.Column(db.Integer, nullable=False)

    def __repr__(self):
        return 'Address: {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}'.format(self.address_id, self.subject_id, self.zip, self.country, self.state, self.city, self.street, self.house_number,
self.apartment_number, self.address_type, self.address_preferred_flag)

Мой routes.py:

  @app.route('/', methods=['GET', 'POST'])
@app.route('/index', methods=['GET', 'POST'])
@login_required
def index():
    form = SearchForm()
    users = PhysicalPerson.query.filter_by(last_name=form.last_name.data, first_name=form.first_name.data,
                                           middle_name=form.middle_name.data).all()
    if form.validate_on_submit():
        users = PhysicalPerson.query.filter_by(last_name=form.last_name.data, first_name=form.first_name.data,
                                               middle_name=form.middle_name.data,
                                               birth_date=form.birth_date.data).all()
        return render_template('index.html', title='Home', form=form, users=users)
    return render_template('index.html', title='Home', form=form, users=users)

Мой index.html:

{% extends "base.html" %}

{% block content %}
    <h1>Поиск клиента</h1>
    <form action="" method="post" novalidate>
    {{ form.hidden_tag() }}
        <p>
            {{ form.last_name.label }}<br>
            {{ form.last_name(size=64) }}
            {% for error in form.last_name.errors %}
                <span style="color: red;">[{{ error }}]</span>
            {% endfor %}
        </p>
        <p>
            {{ form.first_name.label }}<br>
            {{ form.first_name(size=64) }}
            {% for error in form.first_name.errors %}
                <span style="color: red;">[{{ error }}]</span>
            {% endfor %}
        </p>
        <p>
            {{ form.middle_name.label }}<br>
            {{ form.middle_name(size=64) }}
            {% for error in form.middle_name.errors %}
                <span style="color: red;">[{{ error }}]</span>
            {% endfor %}
        </p>
        <p>
            {{ form.birth_date.label }}
            {{ form.birth_date(class="datepicker") }}
        </p>
        <p>
            {{ form.submit() }}
        </p>
    </form>
    {% block page_table %}
            <table class="table table-striped">
                <thead>
                    <tr>
                        <th>Идентификатор</th>
                        <th>Фамилия</th>
                        <th>Имя</th>
                        <th>Отчество</th>
                        <th>Дата рождения</th>
                        <th>Регион</th>
                    </tr>
                </thead>
                <tbody>
                    {% for user in users %}
                        <tr>
                            <td>{{ user.subject_id }}</td>
                            <td>{{ user.last_name }}</td>
                            <td>{{ user.first_name }}</td>
                            <td>{{ user.middle_name }}</td>
                            <td>{{ user.birth_date.date() }}</td>
                            <td>{{ user.addresses.state }}</td>
                        </tr>
                    {% endfor %}
                </tbody>
            </table>
    {% endblock %}
{% endblock %}

Вот что получаю на выходе: введите сюда описание изображения введите сюда описание изображения

Пробовал тестировать, вот мой тест запрос test.py:

users = PhysicalPerson.query.filter_by(last_name='ПЕТИНА', first_name='ЕЛЕНА', middle_name='ВЛАДИМИРОВНА').all()
for user in users:
    state = ''.join([i.state for i in user.addresses.filter_by(address_preferred_flag=1).all()
                     if i.state is not None])
    print(user.subject_id, user.last_name, user.first_name, user.middle_name, user.birth_date.date(),
          state if state != '' else '-')

Результат:

15931287 ПЕТИНА ЕЛЕНА ВЛАДИМИРОВНА 1966-09-12 Г МОСКВА
16825754 ПЕТИНА ЕЛЕНА ВЛАДИМИРОВНА 1983-01-04 -
23634492 ПЕТИНА ЕЛЕНА ВЛАДИМИРОВНА 1950-01-01 -
34835425 ПЕТИНА ЕЛЕНА ВЛАДИМИРОВНА 1978-04-16 -
39411912 ПЕТИНА ЕЛЕНА ВЛАДИМИРОВНА 1970-03-07 -
52341876 ПЕТИНА ЕЛЕНА ВЛАДИМИРОВНА 1985-08-16 ОМСКАЯ
55143830 ПЕТИНА ЕЛЕНА ВЛАДИМИРОВНА 1978-03-05 -
59408179 ПЕТИНА ЕЛЕНА ВЛАДИМИРОВНА 1990-06-03 ТОМСКАЯ

Все работает, здесь я использую еще условие, выбираю те адреса которые актуальные имею 1 в address_prefered_flag и если регион пустой то заменяю его на "-". Подскажите как это можно реализовать используя Jinja2 или может правильный цикл добавить в routes.py.

Огромное спасибо, если кто откликнется.


Ответы (1 шт):

Автор решения: DarKsp

Вопрос решился. Методом проб и ошибок выяснил, что для обхода всех адресов, цикл требуется писать прямо в самом html, в моем случае это был index.html. Может кому-нибудь пригодиться, когда будет создавать поиск и вывод инфомрации в таблицу. Прикладываю доделанный index.html:

{% extends "base.html" %}

{% block content %}
    <h1>Поиск клиента</h1>
    <form action="" method="post" novalidate>
    {{ form.hidden_tag() }}
        <p>
            {{ form.last_name.label }}<br>
            {{ form.last_name(size=64) }}
            {% for error in form.last_name.errors %}
                <span style="color: red;">[{{ error }}]</span>
            {% endfor %}
        </p>
        <p>
            {{ form.first_name.label }}<br>
            {{ form.first_name(size=64) }}
            {% for error in form.first_name.errors %}
                <span style="color: red;">[{{ error }}]</span>
            {% endfor %}
        </p>
        <p>
            {{ form.middle_name.label }}<br>
            {{ form.middle_name(size=64) }}
            {% for error in form.middle_name.errors %}
                <span style="color: red;">[{{ error }}]</span>
            {% endfor %}
        </p>
        <p>
            {{ form.birth_date.label }}
            {{ form.birth_date(class="datepicker") }}
        </p>
        <p>
            {{ form.submit() }}
        </p>
    </form>
    {% block page_table %}
            <table class="table table-striped">
                <thead>
                    <tr>
                        <th>Идентификатор</th>
                        <th>Фамилия</th>
                        <th>Имя</th>
                        <th>Отчество</th>
                        <th>Дата рождения</th>
                        <th>Регион</th>
                        <th>Тип адреса</th>
                    </tr>
                </thead>
                <tbody>
                    {% for user in users %}
                        {% for state in user.addresses.filter_by(address_preferred_flag=1).all() %}
                            <tr>
                                <td>{{ user.subject_id }}</td>
                                <td>{{ user.last_name }}</td>
                                <td>{{ user.first_name }}</td>
                                <td>{{ user.middle_name }}</td>
                                <td>{{ user.birth_date.date() }}</td>
                                {% if state.state == None %}
                                    <td>-</td>
                                {% else %}
                                    <td>{{ state.state }}</td>
                                {% endif %}
                                <td>{{ state.address_type}}</td>
                            </tr>
                        {% endfor %}
                    {% endfor %}
                </tbody>
            </table>
    {% endblock %}
{% endblock %}

Результат выполнения: введите сюда описание изображения

→ Ссылка