【发布时间】:2023-03-19 18:30:01
【问题描述】:
在我的 Django 应用程序中,我试图获取所有 Student 提交 Paper 的计数,包括提交 NO 论文的学生(表示为 count=0 )。
models.py
class Student(models.Model):
idstudent = models.AutoField(primary_key=True)
student_name = models.CharField(max_length=250, null=False, blank=False, verbose_name='Student Name')
class Paper(models.Model):
idpaper = models.AutoField(primary_key=True)
student = models.ForeignKey(Student, on_delete=models.PROTECT, null=False, blank=False)
查询尝试 1:仅返回已提交论文的学生
papers = Paper.objects.order_by('submission_date')
result = papers.values('student', student_name=F('student__student_name')).annotate(count=Count('student')).distinct().order_by('-count')
print(result)
<QuerySet [{'idstudent': 1, 'student_name': '\nMichael Jordan\n', 'count': 4}, {'idstudent': 2, 'student_name': '\nSteve White\n', 'count': 2}, {'idstudent': 3, 'student_name': '\nHillary Clinton\n', 'count': 1}]>
查询尝试 2:返回已提交 0 篇论文的学生,但其他学生的计数为 1
result = Student.objects.values('pk', student_name=F('student_name'))
.annotate(
count=Count(
'pk',
filter=Q(pk__in=Paper.objects.values('student')
)
)
)
).order_by('-count')
print(result)
<QuerySet [{'idstudent': 1, 'student_name': '\nMichael Jordan\n', 'count': 1}, {'idstudent': 2, 'student_name': '\nSteve White\n', 'count': 1}, {'idstudent': 3, 'student_name': '\nHillary Clinton\n', 'count': 1}, , {'idstudent': 4, 'student_name': '\nDoug Funny\n', 'count': 0}, , {'idstudent': 5, 'student_name': '\nSkeeter Valentine\n', 'count': 0}]>
与 Attempt 2 相同,我还使用 Sum(Case( 尝试了以下操作,产生了相同的结果,因为我认识到 Attempt 2 原始 SQL 实际上使用Case(When,但似乎只在Student.pk 出现在Paper.objects.values“列表”中时计数(而不考虑它出现的多少次) .
result = Student.objects.values('pk', student_name=F('student_name')).annotate(
count=Sum(
Case(
When(pk__in=Paper.objects.values('student'), then=1),
default=0, output_field=IntegerField()
)
)
)
<QuerySet [{'idstudent': 1, 'student_name': '\nMichael Jordan\n', 'count': 1}, {'idstudent': 2, 'student_name': '\nSteve White\n', 'count': 1}, {'idstudent': 3, 'student_name': '\nHillary Clinton\n', 'count': 1}, , {'idstudent': 4, 'student_name': '\nDoug Funny\n', 'count': 0}, , {'idstudent': 5, 'student_name': '\nSkeeter Valentine\n', 'count': 0}]>
我如何调整我的查询以包括提交了 0 篇论文的学生,同时又保持正确的学生数量?
【问题讨论】:
标签: django django-views django-queryset django-q