Vadim Tikanov
Vadim Tikanov

Reputation: 671

How do I optimize the following Django model queries?

I got the following Django models:

class Journey(models.Model):
    user_id = models.PositiveIntegerField(db_index=True)

class Visit(models.Model):
    room_id = models.PositiveIntegerField(db_index=True)
    is_passed = models.BooleanField(default=False)
    journey = models.ForeignKey(Journey)

And the following methods:

class JourneyService(object):
    def get_journey_by_user(self, user_id):
        try:
            journey = Journey.objects.get(user_id=user_id)
        except Journey.DoesNotExist:
            raise JourneyNotFoundError
        return journey

    def get_visit_by_room(self, user_id, room_id):
        journey = self.get_journey_by_user(user_id=user_id)
        try:
            visit = journey.visit_set.get(room_id=room_id)
        except Visit.DoesNotExist:
            raise VisitNotFoundError
        return visit

As far as I understand, calling get_visit_by_room will hit the database twice. Can this be improved to just one hit? I've read about select_related lookup, but I struggle to apply it here.

Upvotes: 1

Views: 26

Answers (1)

Daniel Roseman
Daniel Roseman

Reputation: 599600

You can do it in one query with a join:

Visit.objects.get(room_id=room_id, journey__user_id=user_id)

Whether that's actually faster will depend on your database; you should profile.

Upvotes: 2

Related Questions