Django get foreign key object inside Queryset

14,362

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
Share:
14,362
arrt_
Author by

arrt_

Updated on June 05, 2022

Comments

  • arrt_
    arrt_ almost 2 years

    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.