簡體   English   中英

如何根據外鍵字段對查詢集進行排序?

[英]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')


你可以.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]來引用用戶 model 比直接使用User模型[Django-doc]更好。 有關詳細信息,您可以參閱文檔中引用User model的部分

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM