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
Author by
arrt_
Updated on June 05, 2022Comments
-
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 theid
number. In other word, all the fields (including data) fromEvent
plusSubEvent
plusSubSubEvent
in one queryset. This queryset should contains objects with cur_datetime, week_no, day_no, version and length.