Django获取分组数据的最大值

迈赫迪·扎尔(Mehdi Zare)

经过多次试验和错误并检查了类似的问题之后,我认为值得将所有细节都询问一下。

这是一个简单的模型。假设我们有一个Book模型和一个Reserve模型,其中包含每个Book的预订数据。

class Book(models.Model):
    title = models.CharField(
        'Book Title',
        max_length=50
    )

    name = models.CharField(
        max_length=250
    )


class Reserve(models.Model):
    book = models.ForeignKey(
        Book,
        on_delete=models.CASCADE
    )
    reserve_date = models.DateTimeField()

    status = models.CharField(
        'Reservation Status',
        max_length=5,
        choices=[
            ('R', 'Reserved'),
            ('F', 'Free')
        ]
    )

我向模型添加了一本书和两个保留记录:

from django.utils import timezone

book_inst = Book(title='Book1')
book_inst.save()

reserve_inst = Reserve(book=book_inst, reserve_date=timezone.now(), status='R')
reserve_inst.save()

reserve_inst = Reserve(book=book_inst, reserve_date=timezone.now(), status='F')
reserve_inst.save()

我的目标是获取每本书最后预订的数据。基于其他问题,我明白了这一点:

from django.db.models import F, Q, Max


reserve_qs = Reserve.objects.values(
    'book__title'
)

reserve_qs现在具有每本书的最后一个动作,但是当我添加.value()时,它将忽略分组并返回所有记录。

我也尝试用F过滤:

Reserve.objects.values(
    'book__title'
).annotate(
    last_action=Max('reserve_date')
).values(

).filter(
    reserve_date=F('last_action')
)

我正在使用Django 3和SQLite。

威廉·范昂塞姆

通过使用另一个过滤器,您将破坏该GROUP BY机制。但是,您可以通过以下方式简单地获取最后的预订:

from django.db.models import F, Max

Reserve.objects.filter(
    book__title='Book1'
).annotate(
    book_title=F('book__title'),
    last_action=Max('book__reserve__reserve_date')
).filter(
    reserve_date=F('last_action')
)

或所有书籍:

from django.db.models import F, Max

qs = Reserve.objects.annotate(
    book_title=F('book__title'),
    last_action=Max('book__reserve__reserve_date')
).filter(
    reserve_date=F('last_action')
).select_related('book')

因此,我们将在此处计算该书的最大值。由于我们在此加入同一张桌子,因此我们可以正确分组。

这将检索Book过滤后保留的所有所有最后保留通常情况下,每个1个Book但是,如果存在多个,Book其中多个Reservation时间戳完全相同,则将返回多个。

因此,我们可以例如通过以下方式打印预订:

for q in qs:
    print(
        'Last reservation for {} is {} with status {}',
        q.book.title,
        q.reserve_date,
        q.status
    )

但是,对于单本书,最好仅获取Book对象并返回.latest(..)[Django-doc]重新搜索:

Book.objects.get(title='Book1').reserve_set.latest('reserve_date')

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

python在分组数据框时跨多个列获取最大值和最小值

来自分类Dev

如何通过分组结果的键获取最大值

来自分类Dev

在Python中从分组数据中查找最大值

来自分类Dev

将数据框分组到一列,并从一列中获取最大值,并从另一列中获取其对应的值

来自分类Dev

Django:获取列最大值作为整数

来自分类Dev

如何获取数据成名python中最大值的列名?

来自分类Dev

从每小时数据获取每月最大值

来自分类Dev

获取数据框中最大值的位置

来自分类Dev

如何从数据库中获取最大值

来自分类Dev

对于每小时数据,获取每天的最大值

来自分类Dev

获取数据库中varchar列的最大值

来自分类Dev

scala:如何获取数据框中列的最大值

来自分类Dev

获取列的最大值

来自分类Dev

从RichTextBox获取最大值

来自分类Dev

分组时选择最大值的记录

来自分类Dev

通过分组查找最大值

来自分类Dev

Firebird 1.5:按最大值分组

来自分类Dev

分组显示最大值的指标变量

来自分类Dev

Excel查询分组并找到最大值

来自分类Dev

MySql在分组中取最大值

来自分类Dev

选择按年份分组的最大值

来自分类Dev

获取最大值,将其分组,然后将原始计数计入R

来自分类Dev

Oracle11g-获取分组依据和订购依据的最大值

来自分类Dev

T-SQL,在按一列分组的同时从两列中获取最大值

来自分类Dev

Phyton:如何获取按ID分组的每个列的n个最大值的平均值

来自分类Dev

如何按用户ID对表进行分组并为另一列获取最大值?

来自分类Dev

从Postgres记录中的行中获取最大值,并按多列分组

来自分类Dev

获取给定日期范围和按日期分组的最大值PHP MYSQL

来自分类Dev

如何通过分组依据从sql表中获取最大值?

Related 相关文章

热门标签

归档