В Django отфильтруйте набор запросов для двух дат в течение одного дня - PullRequest
1 голос
/ 28 марта 2020

У меня есть 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)

Я хочу найти все Person с, где last_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 Ответ

1 голос
/ 28 марта 2020

Вы можете отфильтровать с помощью:

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

Person.objects.filter(
    <b>last_login__lte=F('date_created') + timedelta(days=1)</b>
)

вы можете вернуть записи, если last_login равно None / NULL, с помощью:

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

Person.objects.filter(
    <b>Q(</b>last_login__lte=F('date_created') + timedelta(days=1)<b>) |</b>
    <b>Q(last_login=None)</b>
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...