arrt_
arrt_

Reputation: 389

Django get foreign key object inside Queryset

I have 3 models:

class Event(models.Model):
    cur_datetime = models.DateTimeField(default=datetime.datetime(1970, 1, 1, 0, 0, 0, 0, pytz.UTC), blank=True, null=True)
    week_no = models.IntegerField()
    day_no = models.IntegerField()

class SubEvent(models.Model):
    event = models.ForeignKey(Event, on_delete=models.CASCADE)
    version = models.IntegerField()

class SubSubEvent(models.Model):
    sub_event = models.ForeignKey(SubEvent, on_delete=models.CASCADE)
    length = models.IntegerField()

I want to get a Queryset from SubSubEvent model, which includes all the Foreign keys as one single object. What I have now is:

querySet = SubSubEvent.objects.filter(sub_event__event__cur_datetime__range=[from_date, to_date])

This will return a queryset, and using a for loop to get __dict__ on each of objects, I get something like this:

{'event_id': 1, '_state': <django.db.models.base.ModelState object at 0x7fd7d9cefeb8>, 'id': 10, 'length': '1'}

This is just a part of the query I want to achieve. What I really want, is all the fields in event_id instead of just the id number. In other word, all the fields (including data) from Event plus SubEvent plus SubSubEvent in one queryset. This queryset should contains objects with cur_datetime, week_no, day_no, version and length.

Upvotes: 3

Views: 16314

Answers (1)

Sherpa
Sherpa

Reputation: 1998

It sounds like you're looking for select_related().

qs = SubSubEvent.objects \
    .select_related('sub_event__event') \
    .filter(sub_event__event__cur_datetime__range=[from_date, to_date])

You can then access the related SubEvent and Event resources without hitting the database.

sub_sub_event = qs[0]
sub_event = sub_sub_event.sub_event    # doesn't hit the database
event = sub_sub_event.sub_event.event  # doesn't hit the database

Upvotes: 5

Related Questions