У меня есть некоторые объекты, которые выглядят ниже. У меня есть несколько единиц недвижимости, которые содержат один или несколько жильцов, а объект арендатора имеет отношение один к одному с пользователямиНесколько соединений в SQLalchemy
class User(Base):
"""
Application's user model.
"""
__tablename__ = 'usr_users'
usr_user_id = Column(Integer, primary_key=True)
usr_email = Column(Unicode(50))
_usr_password = Column('password', Unicode(64))
usr_groups = Column(Unicode(256))
usr_activated = Column(Boolean)
tenant = relationship("Tenant", uselist=False, backref="usr_users")
class Tenant(Base):
__tablename__ = 'ten_tenants'
ten_tenant_id = Column(Integer, primary_key=True)
ten_ptu_property_unit_id = Column(Integer, ForeignKey('ptu_property_units.ptu_property_unit_id'))
ten_usr_user_id = Column(Integer, ForeignKey('usr_users.usr_user_id'))
class PropertyUnit(Base):
__tablename__ = 'ptu_property_units'
ptu_property_unit_id = Column(Integer, primary_key=True)
ptu_pty_property_id = Column(Integer, ForeignKey('pty_propertys.pty_property_id'))
tenants = relationship("Tenant")
Я пытаюсь вытащить все единицы имущества, включая информацию арендатора и электронную почту из таблицы пользователя.
мне удалось получить один присоединиться к довольно легко:
rows = DBSession.query(PropertyUnit).join(Tenant).filter(PropertyUnit.ptu_pty_property_id==request.GET['property_id']).order_by(PropertyUnit.ptu_number)
units = rows.all()
И я уверен, отображение в шаблоне, как это:
% for unit in units:
<%
tenants = unit.tenants
%>
<tr>
<td><a href="/manager/unit?property_unit_id=${unit.ptu_number}">${unit.ptu_number}</a></td>
<td>
% for tenant in tenants:
${tenant.ten_usr_user_id},
% endfor
</td>
</tr>
% endfor
До сих пор так хорошо. Теперь мне нужно, чтобы извлечь информацию о пользователе из внешнего ключа арендатора, так что я мог бы просто лавировать на другой присоединиться:
rows = DBSession.query(PropertyUnit).join(Tenant).join(User).filter(PropertyUnit.ptu_pty_property_id==request.GET['property_id']).order_by(PropertyUnit.ptu_number)
units = rows.all()
Это, кажется, работает в журналах SQL, так как он генерирует правильный SQL, но я «Мне не удалось получить данные так же, как я сделал в первый раз. Это не удается:
% for unit in units:
<%
tenants = unit.tenants
%>
<tr>
<td><a href="/manager/unit?property_unit_id=${unit.ptu_number}">${unit.ptu_number}</a></td>
<td>
% for tenant in tenants:
<%
user = tenant.User
%>
${tenant.ten_usr_user_id},
% endfor
</td>
</tr>
% endfor
Таким образом, приведенный выше код бросает «объект„Арендатор“не имеет атрибута„User“» ошибка.
Как мне добраться до этого пользователя?
Просто обратите внимание, нет причин иметь эти префиксы для всех столбцов, вы уже знаете, что это «адрес электронной почты пользователя», поскольку он находится в пользовательской модели/таблице. Кроме того, у вас есть плюрализированные вещи (например, usr_users), которые должны быть сингулярными (потому что это соотношение «один-к-одному»). – davidism
@davidism Я принимаю вашу точку зрения, но я только что делал это почти 10 лет. Я могу утверждать, что это пригодится, когда вы делаете необработанный SQL ... полностью устраняет необходимость в псевдонимах. Также пригодится, когда вы смотрите на столбец, и вам нужно знать, из какой таблицы он пришел. Это может быть ненужным в SQLalchemy, но я слишком новичок, чтобы точно знать. –