Я пытаюсь создать список лидеров лиги, который я пытаюсь выбрать оптимальную структуру, чтобы избежать проблем в будущем.
В настоящее время у меня есть три модели, представляющие данные, которые я хочу собрать.Season
, Challenge
, Attempt
.
class Season(models.Model):
season = models.CharField(max_length=4)
start_date = models.DateTimeField()
end_date = models.DateTimeField()
class Challenge(models.Model):
season = models.ForeignKey(Season, on_delete=models.CASCADE)
name = models.CharField(max_length=255)
start_date = models.DateTimeField()
end_date = models.DateTimeField()
class Attempt(models.Model):
challenger = models.ForeignKey(User, on_delete=models.CASCADE)
challenge = models.ForeignKey(Challenge, on_delete=models.CASCADE)
points = models.IntegerField(default=0)
Теперь я предполагаю, что следующие утверждения верны в том, что я хочу из этого извлечь.
- Сезон длится один год
- Сезон длится один месяц
- В сезоне может быть много испытаний
- В задании может быть много попыток
- AЗадача не может принадлежать более чем одному сезону
- Попытка не может принадлежать более чем одному испытанию.
Трудность, которую я чувствую, возникнет, когда я попытаюсь отобразить данные.Я хотел бы вернуть таблицу лидеров на текущий сезон, которая рассчитывает наилучшую попытку для пользователя для каждой задачи и возвращает набор запросов с пользователем и их общее количество баллов за весь сезон.
Примерданные
Season(season='2019',
start_date=..., # some date object
end_date=..., # some date object
)
Challenge(season=1, # represents season object above
name='Challenge 1',
start_date=..., # some date object
end_date=..., # some date object
)
Challenge(season=1, # represents season object above
name='Challenge 2',
start_date=..., # some date object
end_date=... # some date object
)
Attempt(challenger=1, # represents user object
challenge=1, # represents challenge 1 above
points=5
)
Attempt(challenger=2, # represents user object
challenge=1, # represents challenge 1 above
points=10
)
Attempt(challenger=1, # represents user object
challenge=2, # represents challenge 2 above
points=5
)
Attempt(challenger=2, # represents user object
challenge=2, # represents challenge 2 above
points=10
)
Ожидаемый результат
- Претендент 2 - 20 баллов
- Претендент 1 - 10 баллов
Как сделать так, чтобы эта модель лучше представляла нужные мне результаты.Я посмотрел сквозные отношения, но я не уверен, полностью ли я их понимаю или нужно ли это здесь.
Кроме того, как мне тогда получить результаты, которые я ищу, используя ORM