查询每月的最后一条数据
在这个示例中,我们将演示如何使用Django查询Book
数据表中姓名为"张三"的每月的最后一条数据。
数据模型
首先,我们定义了一个Book
模型,具有以下字段:
python
from django.db import models
class Book(models.Model):
name = models.CharField(max_length=64, verbose_name="姓名", default=None, null=True)
id_no = models.CharField(max_length=24, verbose_name="身份证号", default=None, null=True)
mobile = models.CharField(max_length=11, verbose_name="手机号", default=None, null=True)
create_at = models.DateTimeField(auto_now_add=True, verbose_name='创建时间', db_index=True)
该模型包含了name
、id_no
、mobile
和create_at
字段。
查询每月的最后一条数据
现在,我们将展示如何查询每月的最后一条数据:
python
from django.db.models import Max, Subquery
from django.db.models.functions import ExtractMonth
last_per_month = (
Book.objects.filter(name="张三")
.annotate(month=ExtractMonth('create_at'))
.values('month')
.annotate(max_create_at=Max('create_at'))
.values('max_create_at')
)
queryset = Book.objects.filter(
name="张三",
create_at__in=Subquery(last_per_month)
)
在这个示例中,我们按照以下步骤进行操作:
- 使用
annotate
和ExtractMonth
函数计算每条记录的月份值,并将结果存储在month
字段中。 - 使用
values
方法获取month
字段的唯一值。 - 使用
annotate
和Max
函数计算每个月的最大create_at
值,并将结果存储在max_create_at
字段中。 - 使用
values
方法再次获取max_create_at
字段的唯一值。 - 使用子查询在
filter
子句中获取每月的最后一条数据。
现在,queryset
将包含每月的最后一条数据的QuerySet
对象,你可以根据需要进行进一步的操作或使用该对象。