gpt4 book ai didi

python - django 注释一个函数,该函数返回具有特征的所有对象中字段的最大值

转载 作者:行者123 更新时间:2023-12-05 06:42:12 25 4
gpt4 key购买 nike

假设我有这个模型:

class Student(models.Model):
class_name = models.CharField()
mark = models.IntegerField()

我想得到类所有分数最高的学生。我可以得到所有类(class)中 mark 最高的学生,就像 this post 中提到的那样.但我想要所有在类(class)中标记 最高的学生,像这样:

Student.objects.annotate(
highest_mark_in_class=Max(
Students.objects.filter(class_name=F('class_name'))
.filter(mark=highest_mark_in_class)
)
)

我可以使用 for 循环来完成此操作,但是对于大型数据库,for 循环相当慢。我不知道是否可以在一行中编写这样的查询?

最佳答案

您将不得不为此使用 2 个查询:

import operator
from functools import reduce
from django.db.models import Max, Q

best_marks = Student.objects.values('class_name').annotate(mark=Max('mark'))
q_object = reduce(operator.or_, (Q(**x) for x in best_marks))
queryset = Student.objects.filter(q_object)

第一个查询获取每个类(class)的最佳分数列表。

第二个查询获取标记和类(class)与列表中的一项匹配的所有学生。

请注意,如果您调用 .annotate(best_mark=Max('mark')) 而不是 .annotate(mark=Max('mark')),您在将字典传递给 Q 对象之前,必须做一些额外的工作将 best_mark 重命名为 mark。而 Q(**x) 非常方便。

关于python - django 注释一个函数,该函数返回具有特征的所有对象中字段的最大值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38076046/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com