这是一个竞赛系统项目.我有这些模型,我知道Contest_id和Problem_id.我正在try 返回一个包含已解决问题的用户的查询集.解决问题的用户提交的分数等于他试图解决的问题的分数. 最后,我需要根据这些用户提交成功提交的时间对他们进行排序.

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)

我试着跟踪代码,但得到了错误的答案.如何对我的查询集进行排序?

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')

然而,模型看起来很"奇怪":提交的作品与比赛没有关联.因此,如果两个(或更多)竞赛共享相同的问题,那么这意味着无论竞赛是什么,它都将接受该问题的第一个完整提交.


Note:通常情况下,使用settings.AUTH_USER_MODEL [Django-doc]来引用用户模型比直接使用User model [Django-doc]要好.欲了解更多信息,您可以查看referencing the User model section of the documentation.

Python相关问答推荐

在Polars(Python库)中将二进制转换为具有非UTF-8字符的字符串变量

PMMLPipeline._ fit()需要2到3个位置参数,但给出了4个位置参数

我们可以为Flask模型中的id字段主键设置默认uuid吗

Python解析整数格式说明符的规则?

将输入聚合到统一词典中

Odoo 16使用NTFS使字段只读

Pandas Data Wrangling/Dataframe Assignment

(Python/Pandas)基于列中非缺失值的子集DataFrame

使用字典或列表的值组合

如何在FastAPI中替换Pydantic的constr,以便在BaseModel之外使用?'

numpy数组和数组标量之间的不同行为

有没有办法让Re.Sub报告它所做的每一次替换?

将数字数组添加到Pandas DataFrame的单元格依赖于初始化

如何关联来自两个Pandas DataFrame列的列表项?

极点:在固定点扩展窗口

奇怪的Base64 Python解码

如何导入与我试图从该目录之外运行的文件位于同一目录中的Python文件?

我应该使用哪一个来判断python中枚举值的唯一性?

Select 满足特定条件的连续元素作为单独的数组

收到Firebase推送通知时,电话不会震动