Получение объектов связанных моделей, есть сложности

Помогите, пожалуйста, советом, идеей, решением. Имеется 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, но с ним проблем нет, т.к. это отдельная модель, которая либо есть в определенный день, либо ее нет.

Картинка для понимания.введите сюда описание изображения

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