使用注释更改 Django 模型的日期字段中的年、月或日

问题描述 投票:0回答:1

我有一个 Django 模型 MyModel

class MyModel(models.Model):
"""My Model that stores date."""

    date = models.DateField()

在我的 API 中,我收到一个参数,

review_month
我需要获取 MyModel 中的所有条目并替换它们的日期年份值。

我对于添加哪一年有以下条件: -> 如果 date__month 大于 review_month,则年份将为当年,否则年份将为上一年。

我需要这些新的日期字段,并为 MyModel 查询集的每个条目更新年份

MyModel.objects.annotate(
   updated_year=Case(
       When(
           Q(review_date__month__gt=review_month.month), then=previous_year),
           default=current_year,
           output_field=IntegerField(),
       ),
   )
)

这仅单独给出年份,但我想要一个包含日期字段的日期和月份的更新日期,以及其中的新更新年份,并且必须是日期字段,因为我需要对其应用排序。

django django-models django-queryset django-model-field django-database-functions
1个回答
0
投票

我已经能够解决这个问题,所以如果将来有人遇到这个问题,我就是这样做的。

MyModel.objects.annotate(
    review_day=Func(
        F('review_date'), Value('DD'), function='to_char', 
        output_field=CharField()
    ),
    review_month=Func(
        F('review_date'), Value('MM'), function='to_char',
        output_field=CharField()
    ),
    updated_year=Case(
        When(Q(review_date__month__gt=review_month.month), 
           then=previous_year,
        ),
        default=current_year,
        output_field=IntegerField(),
    ),
    review_at=Concat(
        F('updated_year'), Value('-'), F('review_month'), 
        Value('-'), F('review_day'), output_field=DateField()
    )
)
© www.soinside.com 2019 - 2024. All rights reserved.