【问题标题】:Getting date from Django datetime field with F() expression使用 F() 表达式从 Django 日期时间字段获取日期
【发布时间】:2018-03-27 08:28:48
【问题描述】:

假设我有一个 Django 模型对象,如果 last_updated 日期时间字段等于今天的日期,它需要更新特定字段。

如果我要使用 F 表达式来避免竞争条件,那么将 last_updated 的日期与使用 timezone.now().date() 的当前日期进行比较的最佳方法是什么?

【问题讨论】:

    标签: python django django-models


    【解决方案1】:

    如果我没记错的话,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)
    


    注意:我知道这是一个有点长的过程。但它会工作

    【讨论】:

      【解决方案2】:

      我认为您想改用the conditional update 来做某事。

      所以大致如下:

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

      【讨论】:

        【解决方案3】:

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

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

        另外,作为一般说明,请记住您的代码的时区行为会影响时间戳和日期之间的比较(即,相同的时间戳可能对应于不同的日期,具体取决于所使用的时区)。

        【讨论】:

          猜你喜欢
          • 2019-10-02
          • 1970-01-01
          • 2017-10-08
          • 1970-01-01
          • 1970-01-01
          • 2011-05-30
          • 1970-01-01
          • 1970-01-01
          • 2019-10-31
          相关资源
          最近更新 更多