Получение объектов связанных моделей, есть сложности
Помогите, пожалуйста, советом, идеей, решением. Имеется 2 модели:
class Tournament(models.Model):
title = models.CharField(max_length=300, db_index=True, verbose_name="Название турнира")
location = RichTextField(max_length=300, blank=True, verbose_name="Место проведения")
prize = models.TextField(max_length=300, blank=True, verbose_name="Призовой фонд")
date_start = models.DateField(verbose_name="Дата начала")
date_end = models.DateField(verbose_name="Дата окончания")
class Stage(models.Model):
tournament = models.ForeignKey('Tournament', null=True, blank=True, on_delete=models.PROTECT, related_name="stages")
stage_type = models.CharField(max_length=100, default='Соревнования', choices=settings.STAGE_TYPE,
verbose_name='Тип соревнования')
title = models.CharField(max_length=200, db_index=True, verbose_name="Название этапа турнира")
date_start = models.DateField(verbose_name="Дата начала")
date_end = models.DateField(blank=True, null=True, verbose_name="Дата окончания")
Турнир может иметь несколько этапов (Stage). Турнир имеет дату начала и дату окончания, этапы также имеют дату начала и дату окончания.
Я вывожу на странице календаря в виджете календаря даты, в которые проходят соревнования. Получаю сначала даты событий От и До. Далее я в цикле получаю все даты, которые входят в диапазон и также добавляю их в set, чтобы отобразить в календаре даты, в которые есть событие.
Во view.py
def calendar_view(request):
tournaments = Tournament.objects.filter(is_published=True).values('date_start', 'date_end')
dates = set()
for event in tournaments:
start_date = event['date_start']
dates.add(start_date)
if event['date_end']:
end_date = event['date_end']
delta = (end_date - start_date).days
dates.add(end_date)
for i in range(int(delta)+1):
dates.add(start_date + timedelta(days=i))
return render(request, 'event/calendar.html', {'events': dates})
Вопрос заключается в следующем: мне необходимо выводить в календаре не только турниры, но и этапы турниров. Проблема заключается в том, что турниры (по моей задумке) могут как содержать этапы (турнир на несколько месяцев), так и не содержать (например турнир-однодневка). И если я буду парсить даты только турнира, в котором есть этапы, то весь календарь на несколько месяцев может быть забит метками с занятыми днями, хотя этапы турнира могут проводиться только раз в неделю и по факту в календаре должны отображаться занятыми только эти дни этапов. Также, если турнир не содержит этапов, то он тоже должен быть отображен в календаре.
Подскажите, как правильно обратиться к модели Турнир, чтобы проверить есть ли у него этапы и вывести собрать сет с датами этапов, а если этапов нет, то добавить в сет только даты таких турниров. По итогу прохода по базу у меня должен отобразиться сет со всеми датами в которые проводятся соревнования).
Я перепробовал несколько вариантов, но все это не то и работает не так. Я пробовал обратиться к модели Stage, тогда я получу все этапы, и могу получить к какому турниру они принадлежат, но если будет Турнир, в котором нет этапов, то в Stage он не отобразится и его даты не попадут в set, и в календаре он не отобразится.
Также у меня есть событие Event, но с ним проблем нет, т.к. это отдельная модель, которая либо есть в определенный день, либо ее нет.