mrhigham
mrhigham

Reputation: 264

Getting and displaying related objects in Django

I know this is simple, but I can't get my head around how to join some models together to display in my template in Django. I have "groups" that can have several "contacts".

So far I've got:

class Group(models.Model):
    group_name = models.CharField()

class Contact(models.Model):
    contact_name = models.ForeignKey(Group)

In my view, at first I assumed that simply getting my groups would also get any attached contacts, however that doesn't appear to be happening as expected:

def get_queryset(self):
    groups = Group.objects.all()
    return groups

I was expecting to do something like this in my template:

{% for group in groups %}
    <h2>{{ group.group_name }}</h2>
    {% for c in group.contact %}
        <h3>{{ c.contact_name }}</h3>
    {% endfor %}
{% endfor %}

This isn't working - what am I doing wrong? What is the correct query in my view to make sure the contact(s) for each group is getting retrieved?

Upvotes: 5

Views: 4805

Answers (1)

Guilherme David da Costa
Guilherme David da Costa

Reputation: 2368

Well, it looks like you've got some of your code from a different place so just so you can fully understand, you can do this in 2 different ways:

1) To access a related object of any kind, being a simple ForeignKey or ManyToMany you just need to go from the opposite model and use _set like this example:

class Group(models.Model):
    group_name = models.CharField()

class Contact(models.Model):
    contact_name = models.ForeignKey(Group)

{{ group.contact_set.all }}

2) You can set up a name different than the default _set changing Contact like this:

class Contact(models.Model):
    contact_name = models.ForeignKey(Group, related_name='contacts')

So, related_name kwarg set a new name for you instead of the _set one:

{{ group.contacts.all }}

I hope I manage to make it clearer about simple access on models related objects.

Upvotes: 8

Related Questions