【问题标题】:How to compare date field with None in django ORM?如何在 django ORM 中将日期字段与 None 进行比较?
【发布时间】:2020-08-18 16:53:13
【问题描述】:

我有一个模型,其中有一个日期字段。

我正在尝试通过传递日期对象或空值来查询模型。

查询应该根据 ORM 查询中提供的输入以不同的方式运行。

我将向 ORM 查询 st_dateexp_date 传递两个变量。 exp_date 有时可以为 None。

如果 exp_date 中有某个值,我需要查询模型并获取所有scheduled_end_date 大于提供的 exp_date 的记录。如果不是,则根本不应该考虑过滤器。

models.py:

class DtModel(models.Model):
    scheduled_start_date = DateField()
    scheduled_end_date = DateField()

ORM 查询:

st_date="2020-05-01"
exp_date=None
DtModel.objects.filter(scheduled_start_date__gte=st_date, scheduled_end_date__lte=exp_date)

exp_date 尝试比较Nonedate field 时,它会抛出一个错误?

ValueError: 不能使用 None 作为查询值

【问题讨论】:

    标签: python django django-models django-views django-orm


    【解决方案1】:

    为什么要查询空值... 如果 None 意味着您想过滤 x > date 而不是 x > date and < date 只需使用较大的日期值。

    if not exp_date:
      st_date="2099-01-01"
    

    【讨论】:

    • 如果exp_date 有一些价值,则需要根据它进行过滤。如果没有,请完全忽略过滤器。
    【解决方案2】:

    您不能在 Django 中使用 None 作为查询值。要过滤具有空值的行,您必须使用scheduled_end_date__isnull=True。根据您对@SakuraFreak 回答的评论,以下应该可以工作

    st_date="2020-05-01"
    exp_date=None
    if exp_date:  # Apply filter only if exp_date is not null
        DtModel.objects.filter(scheduled_start_date__gte=st_date, scheduled_end_date__lte=exp_date)
    

    【讨论】:

      猜你喜欢
      • 2011-08-18
      • 2018-04-04
      • 1970-01-01
      • 2018-04-18
      • 1970-01-01
      • 1970-01-01
      • 2022-12-08
      • 2014-08-22
      • 1970-01-01
      相关资源
      最近更新 更多