2014-11-10 3 views
0

У меня есть некоторые объекты, которые выглядят ниже. У меня есть несколько единиц недвижимости, которые содержат один или несколько жильцов, а объект арендатора имеет отношение один к одному с пользователямиНесколько соединений в 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“» ошибка.

Как мне добраться до этого пользователя?

+0

Просто обратите внимание, нет причин иметь эти префиксы для всех столбцов, вы уже знаете, что это «адрес электронной почты пользователя», поскольку он находится в пользовательской модели/таблице. Кроме того, у вас есть плюрализированные вещи (например, usr_users), которые должны быть сингулярными (потому что это соотношение «один-к-одному»). – davidism

+0

@davidism Я принимаю вашу точку зрения, но я только что делал это почти 10 лет. Я могу утверждать, что это пригодится, когда вы делаете необработанный SQL ... полностью устраняет необходимость в псевдонимах. Также пригодится, когда вы смотрите на столбец, и вам нужно знать, из какой таблицы он пришел. Это может быть ненужным в SQLalchemy, но я слишком новичок, чтобы точно знать. –

ответ

0

Нет атрибута User на Tenant, потому что вы не определили его. Вы вызвали его usr_users в backref, поэтому вам нужно получить к нему доступ как tenant.usr_users.

+0

Вот для чего нужен задний рефер! Я только что включил его, потому что это то, что содержится в документации. –

Смежные вопросы