2015-09-23 2 views
1

я получил следующие модели Django:Как оптимизировать следующие запросы модели Django?

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) 

И следующие методы:

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 

Насколько я понимаю, называя get_visit_by_room ударят базу данных дважды. Может ли это быть улучшено до одного удара? Я читал о select_related поиске, но я изо всех сил стараюсь применить его здесь.

ответ

2

Вы можете сделать это в одном запросе с объединением:

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

ли это на самом деле быстрее, будет зависеть от вашей базы данных; вы должны профиль.

Смежные вопросы