【问题标题】:How to compare DateTimeField with Date in Django filter funtion?如何在 Django 过滤函数中比较 DateTime 字段和 Date?
【发布时间】:2021-06-04 20:46:23
【问题描述】:

在我的 django 应用程序中,我有一个带有 DateTimeField“send_date”的 MessageModel。我想过滤消息以使所有消息在某一天(日期)发送。如何将 DateTimeField 与 Date 进行比较以获取当天发送的所有消息。我试过了

 query_result= MessageLogModel.objects.filter(received_date=myDate)

但它没有显示正确的结果。这是模型的定义

class MessageModel(models.Model):

    sender = models.ForeignKey(User, on_delete=models.CASCADE, 
                                   related_name='+', verbose_name=_('Destinatario'), editable=False, null=True, blank=True)

    subject = models.CharField(verbose_name=_("Asunto"),max_length=50)

    send_date = models.DateTimeField(verbose_name=_("Fecha de envío") ,auto_now_add=True)
        
    message_body = models.TextField(verbose_name=_("Mensaje"))

    class Meta:
        db_table = 'riesgo_message'
        managed = True
        verbose_name = _("Mensaje")
        verbose_name_plural = _("Mensajes")

    def __str__(self):
        return self.subject

【问题讨论】:

    标签: python django django-orm


    【解决方案1】:

    几种解决方案:

    1. 使用SQL提供的date函数(__date=):
        query_result= MessageLogModel.objects.filter(received_date__date=myDate)
    

    或:

        query_result= MessageLogModel.objects.filter(received_date__date="2021-06-01")
    
    1. 使用__range=:
        query_result= MessageLogModel.objects.filter(received_date__range=(myDate, myDate + timedelta(days=1)))
    
    1. 使用__startswith=__contains=,用法与__date=类似
    2. 使用__gt=__lt=,类似于__range=

    以上所有选项都假设您在特定日期和数据库中存储的数据之间使用相同的时区,如果不是,假设您在 UTC 中保存日期时间字段,而变量 myDate 的时区是不是UTC,那么您可能需要先转换一对UTC日期时间范围,然后使用rangegt, lt过滤器查询数据库

    【讨论】:

      【解决方案2】:

      如果我理解你的话:

      query_result= MessageLogModel.objects.filter(<received_date/send_date>__date=datetime.date(2021,6,5))
      

      应该能帮到你。

      请注意,您在模型中没有该字段。(因此 <..>)

      文档: https://docs.djangoproject.com/en/3.2/ref/models/querysets/#date

      【讨论】:

        【解决方案3】:

        1.在该日期获得结果:

        query_result= MessageLogModel.objects.filter(received_date='2021-06-11')
        
        1. 要获得某个日期范围内的结果:给出开始日期和结束日期

          query_result = MessageLogModel.objects.filter(received_date__range=['2021-06-01','2021-06-11'])
          

        【讨论】:

          猜你喜欢
          • 2020-10-26
          • 1970-01-01
          • 2012-05-03
          • 2016-02-24
          • 1970-01-01
          • 2011-02-15
          • 1970-01-01
          • 1970-01-01
          • 2010-12-23
          相关资源
          最近更新 更多