Как решить эту проблему с запросом в django без использования цикла for?
У меня есть запрос, содержащий список отправленных пользователями материалов. Модели приведены ниже, но вот суть:
- Each submission belongs to one problem that user tried to solve.
- However, user can make as many submission as they want for a single problem.
- There are several problems.
- 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)