Ben Keating
Ben Keating

Reputation: 8366

Confused about basic multiple-table relation & access using Django

I have a few data models (tables) which are associated with each other. If a model has a related field pointing to another model, no problem, i can access that easy in the templates but how do I make calls that have reverse-only relation?

Example:

Company may have any number of Location and each Location may have any number of Contact.

So the Company table mentions neither the Location or Contact, but Location has a fk to Company. and Contact has a fk to Location.

In the template, I'd like to display Companies that match certain criteria. With them, I'd like their locations and their locations contacts to also display.

My thought is, maybe I make the Company query first, then make another for Location (and Contact) and some how inject them into the same dict but that sounds awfully confusing to me and this, im sure, is a common pattern.

Any tips?

Upvotes: 0

Views: 146

Answers (1)

nrabinowitz
nrabinowitz

Reputation: 55688

When you make a ForeignKey field on one model, the target model automatically gets a attribute called <referring_model>_set - so in your example, each Company instance has a location_set attribute, and each Location has a contact_set attribute. These attributes actually refer to Manager instances, similar to Company.objects, that return only objects related to the current instance.

You can use these backwards references to iterate through the related objects in your templates, e.g.:

<ul>
{% for location in company.location_set %}
    <li>
        <em>{{ location.name }}</em>
        <ul>
        {% for contact in location.contact_set %}
            <li>{{ contact.name }}</li>
        {% endfor %}
        </ul>
    </li>
{% endfor %}
</ul>

You can read more about this kind of backwards relationship in the Django docs.

Upvotes: 2

Related Questions