Как решить эту проблему с запросом в django без использования цикла for?

У меня есть запрос, содержащий список отправленных пользователями материалов. Модели приведены ниже, но вот суть:

  1. Each submission belongs to one problem that user tried to solve.
  2. However, user can make as many submission as they want for a single problem.
  3. There are several problems.
  4. submissions are ordered by time of creation (descending)

Мне нужно получить список всех финальных представлений пользователей. финальное представление - это последнее представление пользователя для конкретной проблемы. Естественно, если пользователь решает несколько проблем, то у него будет столько же финальных представлений.

Как я могу получить это? Вот что у меня получилось, но я не знаю, как продолжить:

    all_users = list_users(contest_id) #query of all users in contest
    problems = list_problems(contest_id) #query of all problems in contest
    final_submissions = Submission.objects.none()
    for user in all_users:
        for problem in problems:
            query = list_problem_user_submissions(contest_id, user.id, problem.id)[:1]
            if query.exists():
                final_submissions.union(query)

Это не работает, но я также не могу придумать ничего без цикла for. Есть ли способ убрать этот цикл и сделать это прямо в запросе?


Вот модели:

**User**: default django user model

Конкурс:

    name = models.CharField(max_length=50)
    holder = models.ForeignKey(User, on_delete=models.CASCADE)
    start_time = models.DateTimeField()
    finish_time = models.DateTimeField()
    is_monetary = models.BooleanField(default=False)
    price = models.PositiveIntegerField(default=0)
    problems = models.ManyToManyField(Problem)
    authors = models.ManyToManyField(User, related_name='authors')
    participants = models.ManyToManyField(User, related_name='participants')

Проблема:

    name=models.CharField(max_length=50)
    description=models.CharField(max_length=1000)
    writer=models.ForeignKey(user,on_delete=CASCADE)
    score=models.PositiveIntegerField(default=100)

Представление:


class Submission(models.Model):
    submitted_time=models.DateTimeField()
    participant=models.ForeignKey(user,on_delete=CASCADE, related_name="submissions")
    problem=models.ForeignKey(Problem,on_delete=CASCADE, related_name="submissions")
    code=models.URLField(max_length=200)
    score=models.PositiveIntegerField(default=0)
Вернуться на верх