Вывести список всех адресов найденных по человеку
Использую 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 шт):
Вопрос решился. Методом проб и ошибок выяснил, что для обхода всех адресов, цикл требуется писать прямо в самом 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 %}


