如何在 Django 过滤器函数中比较日期时间字段和日期?

How to compare DateTimeField with Date in Django filter funtion?

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

如果我理解你:

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

几种解决方案:

  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 filter

查询数据库

1.To 在该日期获得结果:

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'])