LukasKawerau
LukasKawerau

Reputation: 1071

Get Foreign Key parent of object - Django

Suppose I got two models like this:

class Article(models.Model):
    article_title = models.CharField(max_length=100)

class EventRecord(models.Model):
    article = models.ForeignKey(Article)

In a view, I select a certain EventRecord and want to show the Title of the Article it is related to as well. The following does not work:

def classify(request, pk):
    event = get_object_or_404(EventRecord, pk=pk)
    article_id = event.article
    article = get_object_or_404(Article, pk=article_id)

How do I make this work? Any help is really appreciated!

Upvotes: 1

Views: 9812

Answers (2)

miki725
miki725

Reputation: 27861

Django automatically handles this for you. For example:

>>> record = EventRecord.objects.get(...)
>>> isinstance(record.article, Article)
True
>>> record.article.article_title
u'title here'

This is one of the magical things Django does (nothing is magic but anyway...). Please keep in mind that in order for this work Django will usually execute some extra database queries. To eliminate them, you can use select_related method. Below is a snippet which eliminates extra queries and does what you want:

def classify(request, pk):
    record = EventRecord.objects.filter(pk=pk).select_related()

    # the above returns queryset hence you have to extract the record manually
    if not len(record):
        raise Http404()
    else:
        record = record[0]

    # now use record as usual and no extra queries will be executed
    title = record.article.article_title
    ...

Upvotes: 14

Timmy O'Mahony
Timmy O'Mahony

Reputation: 53971

event.article returns the actual Article object, not the primary key, so you don't need to do another database query.

def classify(request, pk):
    event = get_object_or_404(EventRecord, pk=pk)
    if not event.article:
        raise Http404
    print event.article.article_title

Upvotes: 3

Related Questions