【问题标题】:Get id of object with maximum field in Django在Django中获取具有最大字段的对象的ID
【发布时间】:2020-05-14 22:50:36
【问题描述】:

假设在 Django 中,我有一个 Publisher 模型和一个 Book 模型以一对多的关系连接到它。让我们进一步说这本书有一个times_checked_out 字段。如何取回每个出版商最常签出图书的 ID 查询集?

我不能做的就是

Publisher.objects.annotate(max_book = Max('books__times_checked_out'))

因为这会返回最多退房,而不是最多退房的书。我也想不出如何以有用的方式添加Case(When())。在 Django 中执行此操作的方法是什么?

【问题讨论】:

  • 你想要,1)每个出版商(列表)的最大签出书的 ID,2)总体最大签出书的 ID?
  • 我想要第一个。

标签: django


【解决方案1】:

您应该能够反向执行此操作,并获得代表每个出版商最高 times_checked_out 的图书查询集:

books = Book.objects\
  .order_by('publisher', '-times_checked_out')\
  .distinct('publisher')

另一种(但更复杂的方法)是这样的:

from django.db.models import Max, F

books = Book.objects\
  .annotate(max_checkout=Max('publisher__books__times_checked_out'))\
  .filter(times_checked_out=F('max_checkout'))

灵感来自this answer

更多关于使用F expressions in filters

【讨论】:

    猜你喜欢
    • 2023-02-17
    • 1970-01-01
    • 2020-07-23
    • 2017-10-12
    • 1970-01-01
    • 2013-05-21
    • 2016-02-24
    • 1970-01-01
    • 2015-08-11
    相关资源
    最近更新 更多