Использование select_related в django для конкретного случая использования?

У меня есть эти две модели, и я пытаюсь выстроить логику: задав комбинацию дней (например, Mon-Tue 2-3 pm), я хочу узнать имена всех преподавателей. Я не могу этого сделать. Я пробовал использовать select_related, но я не могу использовать его правильно, я думаю. :)

class TimeSlot(models.Model):
    
    instructor = models.ForeignKey('Instructor', on_delete=models.PROTECT)
    day = models.CharField(max_length=10, choices=WEEKDAYS)
    start_time = models.TimeField()
    end_time = models.TimeField()
    
class Instructor(models.Model):
    name = models.CharField(max_length=50, validators=[validate_instructor_name])
 
<<<Если я правильно понимаю, отфильтруйте

и аннотируйте их именами инструкторов (или просто получите временные интервалы и извлеките связанные с ними имена инструкторов позже в вашей логике) TimeSlot

Непроверенные, с моей точки зрения:

select = TimeSlot.objects.filter(
     day__in = ['Monday', 'Thursday'],       # or whatever
     start_time__gte = start_of_time_window, # f.ex datetime.time( hour=14, minute=30)
     end_time__lte = end_of_time_window,     # f.ex.datetime.time( hour=15)
).select_related( 
     'instructor'
).annotate(
      instructor_name='instructor__name'
)

После того, как аннотация заработает, если вам нужны только имена преподавателей, вы можете сделать это, добавив .values_list('instructor_name') (но я не уверен, что вы можете собирать аннотации в списке значений).

select_related просто гарантирует, что запрос к БД также возвращает связанные объекты инструкторов, так что последующее обращение к отфильтрованному timeslot.instructor.whatever не будет снова обращаться к БД для получения объекта инструктора. (Это часто называют устранением проблемы N+1, которая, IMO, должна быть проблемой 1+N)

Вернуться на верх