gpt4 book ai didi

django - 带嵌套过滤器的Django注释

转载 作者:行者123 更新时间:2023-12-03 12:16:45 24 4
gpt4 key购买 nike

是否可以在注释中进行过滤?

在我看来,这样的事情(实际上是行不通的)
Student.objects.all().annotate(Count('attendance').filter(type="Excused"))
结果表将为每位学生提供原谅缺勤的数量。浏览文档过滤器只能在注释之前或之后,而不会产生期望的结果。

解决方法是这样

for student in Student.objects.all():
student.num_excused_absence = Attendance.objects.filter(student=student, type="Excused").count()

这可行,但是会执行许多查询,在实际应用中,这可能会变得不切实际。我认为这种语句在SQL中是可能的,但如果可能的话,宁愿保留在ORM中。我什至尝试进行两个单独的查询(一个用于所有学生,另一个用于获取总数),并将它们与|组合。组合改变了总数:(

阅读答案和评论后的一些想法

我使用额外的sql here解决了出勤问题。
  • Timmy's blog post非常有用。我的答案基于此。
  • hash1baby的答案有效,但似乎与sql同样复杂。它还需要执行sql,然后将结果添加到for循环中。这对我来说是不利的,因为我将许多此类过滤查询堆叠在一起。我的解决方案建立了一个包含许多过滤器和其他功能的大型查询集,并立即执行所有查询。
  • 如果性能没有问题-我建议for循环解决。到目前为止,这是最容易理解的。
  • 最佳答案

    从Django 1.8开始,您可以直接在ORM中执行此操作:

    students = Student.objects.all().annotate(num_excused_absences=models.Sum(
    models.Case(
    models.When(absence__type='Excused', then=1),
    default=0,
    output_field=models.IntegerField()
    )))

    答案改编自 another SO question on the same topic

    我没有测试上面的示例,但是在我自己的应用程序中确实完成了类似的工作。

    关于django - 带嵌套过滤器的Django注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4620385/

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