如何从已生成的批注向Django批注日期字段添加日期

2024-09-30 20:23:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我的模型看起来像这样

class Model(models.Model):
    user_id = models.ForeignKey()
    date = models.DateField()
    field1 = models.FloatField()
    field2 = models.FloatField()

我有一个问题

queryset = Model.objects.filter(user_id__exact=5) \
                       .annotate(weekstartdate=Trunc('date', 'week')) \
                       .values('weekstartdate') \
                       .annotate(avg_field1=Avg('field1')) \
                       .annotate(avg_field2=Avg('field2')) \
                       .order_by('-weekstartdate')

这是完美的工作。现在,我想将WeekenDate字段添加到上面的queryset中,该queryset的日期=weekstartdate+6天。我在上面的查询中添加了以下行

.annotate(weekenddate=Trunc('date', 'week') + timedelta(days=7), output_field=DateField())

但它在抱怨:

TypeError: QuerySet.annotate() received non-expression(s): <django.db.models.fields.DateField>

相对进口

from django.db.models import Avg, Q
from django.db.models.functions import Trunc
from django.db.models import DateTimeField, ExpressionWrapper, F, DateField

注:- 查询集之后的简单for循环不是我要寻找的,因为在手动分配字段之后,由于查询集的惰性,查询集过滤器仍然从旧的查询集获取查询。 若答案可以在dateutil库的relativedelta中,那个就更好了


Tags: djangofromimportdbdatemodelmodelsavg
1条回答
网友
1楼 · 发布于 2024-09-30 20:23:49

您需要在它周围使用ExpressionWrapper

YourModel.objects.annotate(
    weekenddate=models.ExpressionWrapper(
        Trunc('date', 'week') + timedelta(days=7),
        output_field=models.DateField(),
    ),
)

相关问题 更多 >