Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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.

like image 800
arrt_ Avatar asked Jul 03 '26 10:07

arrt_


1 Answers

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
like image 166
Sherpa Avatar answered Jul 05 '26 06:07

Sherpa



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!