Reputation: 671
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
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