在Django中,筛选一天内两个日期时间的查询集

时间:2020-03-28 17:03:58

标签: django

我有一个类似Django的模型:

from django.db import models

class Person(models.Model):
    # ...
    last_login = models.DateTimeField(null=True, blank=True)
    date_created = models.DateTimeField(auto_now_add=True)

我想找到Personlast_login的一天之内的所有date_created

到目前为止,我有:

from datetime import timedelta
from django.db.models import F

Person.objects.annotate(
    duration=F("last_login") - F("date_created")
).filter(duration__lte=timedelta(days=1))

但是当我这样做时,错误的尾端就像:

  File ".../lib/python3.7/site-packages/django/db/models/fields/__init__.py", line 1316, in to_python
    parsed = parse_datetime(value)
  File ".../lib/python3.7/site-packages/django/utils/dateparse.py", line 107, in parse_datetime
    match = datetime_re.match(value)
TypeError: expected string or bytes-like object

我不确定自己在做什么错,可能是因为timedelta(days=1)

(并且我不认为这是直接的错误),我不确定该查询是否考虑到last_login可能是None的事实。

1 个答案:

答案 0 :(得分:1)

您可以使用以下方法进行过滤:

from datetime import timedelta
from django.db.models import F

Person.objects.filter(
    last_login__lte=F('date_created') + timedelta(days=1)
)

如果last_login也是None / NULL,则可以返回记录,

from datetime import timedelta
from django.db.models import F, Q

Person.objects.filter(
    Q(last_login__lte=F('date_created') + timedelta(days=1)) |
    Q(last_login=None)
)