【发布时间】:2018-03-27 08:28:48
【问题描述】:
假设我有一个 Django 模型对象,如果 last_updated 日期时间字段等于今天的日期,它需要更新特定字段。
如果我要使用 F 表达式来避免竞争条件,那么将 last_updated 的日期与使用 timezone.now().date() 的当前日期进行比较的最佳方法是什么?
【问题讨论】:
标签: python django django-models
假设我有一个 Django 模型对象,如果 last_updated 日期时间字段等于今天的日期,它需要更新特定字段。
如果我要使用 F 表达式来避免竞争条件,那么将 last_updated 的日期与使用 timezone.now().date() 的当前日期进行比较的最佳方法是什么?
【问题讨论】:
标签: python django django-models
如果我没记错的话,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)
注意:我知道这是一个有点长的过程。但它会工作
【讨论】:
我认为您想改用the conditional update 来做某事。
所以大致如下:
Client.objects.update(
other_field=Case(
When(last_updated__eq=datetime.date.today(),
then=Value('OTHER_FIELD_VALUE'))
)
)
【讨论】:
如果您希望根据日期进行过滤,并且您的模型有一个 DateTime 字段,您可以简单地使用 Django 的 __date 查找:
MyModel.objects.filter(last_updated__date=timezone.now().date()).update(...)
另外,作为一般说明,请记住您的代码的时区行为会影响时间戳和日期之间的比较(即,相同的时间戳可能对应于不同的日期,具体取决于所使用的时区)。
【讨论】: