Фильтр набора запросов Django - почему объект, соответствующий всем критериям фильтра, не включен в набор результатов? - PullRequest
0 голосов
/ 13 мая 2018

Мое веб-приложение не отправляет напоминания определенным пользователям, которые должны их получать.При попытке отладки следующий пример в оболочке Python меня сильно смутил.Есть ли что-то, что я пропускаю или делаю неправильно в фильтре?

Если нет ничего явно неправильного, как я могу отладить эту проблему?

>>> now = timezone.now()
>>> an_hour_ago = now - datetime.timedelta(hours=1)
>>> suz = User.objects.get(email="redacted")
>>> suz.reminded
False
>>> suz.wait_until <= now
True
>>> suz.wait_until >= an_hour_ago
True
>>> suz.is_active
True
>>> remindable = User.objects.filter(is_active=True,
...                                  reminded=False,
...                                  wait_until__gte=an_hour_ago,
...                                  wait_until__lte=now)
>>> suz in remindable
False

Редактировать : добавление в мою модель пользователя.

class User(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(unique=True)
    is_active = models.BooleanField(default=True)
    wait_until = models.DateTimeField(null=True, default=None)
    # etc.

Редактировать 2 : Некоторый дополнительный контекст:

У меня есть представление, в котором пользователь выполняет задачу.После выполнения задачи для wait_until устанавливается случайное время на основе диапазона, заданного в объекте конфигурации.Соответствующий код с этой точки зрения:

config = Configuration.objects.first()
min_minutes = config.min_minutes_between_tasks
max_minutes = config.max_minutes_between_tasks
when = now + datetime.timedelta(minutes=randint(min_minutes,
                                                max_minutes+1))
user.wait_until = when
user.alerted = False
user.save()

Редактировать 3 : Я не уверен, что случилось, но я, вероятно, просто идиот.

Я перезапустил свойоболочка python и suz теперь возвращаются корректно в remindable, как и ожидалось.Я подозреваю, что изменил один из атрибутов выше и не запустил suz.save().Это, безусловно, объясняет это.ОРМ ... не забудьте save() ваши объекты в памяти, дети!

1 Ответ

0 голосов
/ 13 мая 2018

Прежде всего, добавьте как можно больше информации в вопрос.Трудно увидеть проблему, когда недостаточно фона.Я до сих пор не знаю, что это now:

when = now + datetime.timedelta(minutes=randint(min_minutes,
                                                max_minutes+1))

А что такое user.alerted?Если это не имеет значения, не показывайте его.

При отладке:

  1. убедитесь, что все объекты, по которым вы фильтруете, были использованы для получения искомого объекта (то есть то, что предложил @Alex Hall, добавьте email)
  2. Если вы можете убедиться, что все сравниваемые времена имеют одинаковый тип, и часовой пояс
  3. Попробуйте удалить критерии фильтра по одному, см.какая проблема может быть
  4. Напечатайте QuerySet, созданный фильтром - какие объекты были включены, а какие не были?
  5. Какую базу данных вы используете?Может сохраняться время по-разному при сохранении
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...