如何在Django过滤器功能中将DateTimeField与Date进行比较?

时间:2021-06-04 20:46:23

标签: python django django-orm

在我的 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

3 个答案:

答案 0 :(得分: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 保存日期时间字段,而变量的时区为 {{1} } 不是UTC,那么你可能需要先转换一对UTC的日期时间范围,然后使用myDaterange过滤器查询数据库

答案 1 :(得分:0)

如果我理解你:

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

答案 2 :(得分:0)

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'])
    
相关问题