[英]How to sort a queryset based on a foreign key field?
這是一個競賽系統項目。 我有這些模型,我知道 contest_id 和 problem_id。 我正在嘗試返回一個包含已解決問題的用戶的查詢集。 解決問題的用戶提交的分數等於他試圖解決的問題的分數。 最后我需要根據他們提交成功的時間對這些用戶進行排序。
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')
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]來引用用戶 model 比直接使用User
模型[Django-doc]更好。 有關詳細信息,您可以參閱文檔中引用User
model的部分。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.