2015-03-05 5 views
0

У меня две модели: компания и контакт. Компания может иметь много контактов.Соедините два стола и покажите все комбинации

class Company(db.Model): 
    __tablename__ = 'company' 

    id = db.Column(db.Integer, primary_key=True) 
    companyname = db.Column(db.String()) 
    contacts = db.relationship('Contact', backref='contact', lazy='dynamic') 

    def __init__(self, companyname): 
     self.companyname = companyname 

    def __repr__(self): 
     return '<id {}>'.format(self.id) 

    def company_contacts(self): 
     return Contact.query.join(id = Contact.company_id) 


class Contact(db.Model): 
    __tablename__ = 'contact' 

    id = db.Column(db.Integer, primary_key=True) 
    firstname = db.Column(db.String()) 
    lastname = db.Column(db.String()) 
    emailaddress = db.Column(db.String()) 
    company_id = db.Column(db.Integer, db.ForeignKey('company.id')) 

    def __init__(self, firstname, lastname, emailaddress, company_id): 
     self.firstname = firstname 
     self.lastname = lastname 
     self.emailaddress = emailaddress 
     self.company_id = company_id 

    def __repr__(self): 
     return '<id {}>'.format(self.id) 

Я хочу, чтобы показать список с компаниями и их контакты в шаблоне:

Company Name 
First Name Last Name 

Company Name 
First Name Last Name 
First Name Last Name 

Я планировал сделать это с помощью присоединиться к заявлению:

group = Company.query.join(contacts).all() 

и имеют для цикла в моем шаблоне итерации, хотя это. Это не сработало. Как я могу отображать компании с их контактами, сгруппированными под ними?

ответ

0

У вас есть отношения между компанией и контактом, поэтому у вас уже есть контакты, сгруппированные по компаниям. Было бы более эффективным в этом случае не указывать lazy='dynamic', и ваш backref следует, вероятно, называть company.

contacts = db.relationship('Contact', backref='company') 

Вы можете запросить с joinedload возможностью построить один запрос, который извлекает обе компании и связанные с ними контакты. (Вы не можете сделать это с lazy='dynamic'.) В целях:

companies = Company.query.options(db.joinedload('contacts')).all() 
return render_template('companies.html', companies=companies) 

Чтобы отобразить их, использовать вложенные для петель в шаблоне.

{% for company in companies %} 
<p>{{ company.companyname }} 
<ul>{% for contact in company.contacts %} 
    <li>{{ contact.firstname }} {{ contact.lastname }} 
{% endfor %}</ul> 
{% endfor %} 
+0

Thanks David! Я сделал изменения, которые вы описали в модели (удаленный лентяй и обновил backref), и отредактировал запрос в представлении и цикл for в шаблоне. Теперь я получаю компании, но еще не контакты ниже. Например. элемент ul остается пустым. Я думаю, что это имеет какое-то отношение к идентификатору компании, который не связан с контактом, но пока не может понять, почему. –

+0

Вычислено, это было для петли: {% для контакта в компании.контакты%} Обратите внимание на контакты за контактами. –

+0

@JelmerdeJong фиксированный, спасибо, что указал. – davidism

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