使用F()表达式从Django datetime字段获取日期

3
假设我有一个Django模型对象,如果“last_updated”日期时间字段等于今天的日期,则需要更新特定字段。如果我使用F表达式来避免竞争条件,最好的方法是如何使用“timezone.now().date()”比较“last_updated”的日期?
3个回答

3
如果我没记错,F() 不能执行那个操作。所以我建议使用 Extract() 来实现相同的功能。
from django.db.models.functions import ExtractDay, ExtractMonth, ExtractYear

queryset = SampleModel.objects.annotate(day=ExtractDay('last_updated'),
                                        month=ExtractMonth('last_updated'),
                                        year=ExtractYear('last_updated')
                                        ).filter(day=timezone.now().day,
                                                 month=timezone.now().month,
                                                 year=timezone.now().year
                                                 )

这将返回一个QuerySet(),所以您可以通过以下.get()方法获取特定实例,如下所示,
specific_model_instance = queryset.get(id=specific_id)

注意:我知道这个过程有点长。但它会起作用。

1
我想你想要使用条件更新来完成某些操作。

因此,可以这样做:

Client.objects.update(
  other_field=Case(
    When(last_updated__eq=datetime.date.today(),
         then=Value('OTHER_FIELD_VALUE'))
  )
)

1
如果您想根据日期进行过滤,并且您的模型具有DateTime字段,则可以简单地使用Django的__date查找:

MyModel.objects.filter(last_updated__date=timezone.now().date()).update(...)

另外,需要注意的是,您代码中的时区行为会影响时间戳和日期之间的比较(即,相同的时间戳可能对应于不同的日期,这取决于使用哪个时区)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接