Это проект конкурсной системы. У меня есть эти модели, и я знаю идентификатор конкурса и идентификатор проблемы. Я пытаюсь вернуть набор запросов, содержащий пользователей, решивших проблему. Пользователь, решивший проблему, — это тот, чей балл за отправку равен баллу задачи, которую он пытался решить. В конце мне нужно отсортировать этих пользователей в зависимости от времени, когда они отправили свое успешное представление.
class Contest(models.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')
class Problem(models.Model):
name = models.CharField(max_length=50)
description = models.CharField(max_length=1000)
writer = models.ForeignKey("accounts.User", on_delete=models.CASCADE)
score = models.PositiveIntegerField(default=100)
class Submission(models.Model):
submitted_time = models.DateTimeField()
participant = models.ForeignKey(User, related_name = "submissions", on_delete=models.CASCADE)
problem = models.ForeignKey(Problem, related_name = "submissions", on_delete=models.CASCADE)
code = models.URLField(max_length=200)
score = models.PositiveIntegerField(default=0)
Я пробовал следующий код, но получаю неправильный ответ. Как я могу отсортировать свой QuerySet?
def list_users_solved_problem(contest_id, problem_id):
problem_score = Problem.objects.get(id=problem_id).score
successful_submissions_ids = Submission.objects.filter(
Q(score=problem_score) & Q(problem__id=problem_id)).
values_list('participant__id', flat=True)
return Contest.objects.get(id=contest_id).
participants.filter(id__in=successful_submissions_ids).
order_by('submissions__submitted_time')
Как Submission
связан с конкурсом? Похоже, что между ними нет никакой связи, поэтому для конкурса у ваших участников могут быть всевозможные материалы, которые могут быть/не иметь отношения к этому конкурсу...
Вы можете .filter(…) [Django-doc] с помощью:
from django.db.models import F
User.objects.filter(
participants=contest_id,
submissions__problem_id=problem_id,
submissions__score=F('submissions__problem__score')
).order_by('submissions__submitted_time')
Однако моделирование выглядит «странно»: заявка не связана с конкурсом. Таким образом, если в двух (или более) конкурсах используется одна и та же проблема, это означает, что будет принято первое полное решение этой задачи, независимо от того, что это за конкурс.
Примечание. Обычно лучше использовать settings.AUTH_USER_MODEL [Django-doc] для ссылки на модель пользователя, чем напрямую использовать Модель пользователя [Django-doc] . Для получения дополнительной информации вы можете увидеть ссылку на раздел User model документации.
Похоже, конкурс может содержать несколько задач?