Использование 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)