Django queryset过滤器 - 为什么满足过滤器中未包含在结果集中的所有条件的对象?

时间:2018-05-12 21:34:42

标签: python django orm

我的网络应用不会向应该获取提醒的某些用户发送提醒。在尝试调试时,python shell中的以下示例让我非常困惑。我有什么遗漏,或在过滤器中做错了吗?

如果没有明显错误,我该如何调试此问题?

>>> 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将根据Configuration对象中设置的范围设置为随机时间。该视图中的相关代码:

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 shell,suz现在正按预期在remindable中正确返回。我怀疑我改变了上面的一个属性并且没有运行suz.save()。这肯定会解释它。 ORMs ...记得save()你的记忆中的物品,小孩!

1 个答案:

答案 0 :(得分:2)

首先,尽可能将信息添加到问题中。 当背景不足时很难看到问题。 我仍然不知道这是now

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

什么是user.alerted?如果没关系,请不要显示它。

调试时:

  1. 确保您过滤的所有内容都用于获取 你正在寻找的对象(即@Alex Hall所建议的,添加 email
  2. 如果你能确保比较所有不同的时间 是相同的类型和时区
  3. 尝试删除过滤条件之一 一个人,看看哪个可能是问题
  4. 打印过滤器生成的QuerySet - 包含哪些对象,哪些不是?
  5. 您使用的数据库是什么?保存时可能会以不同方式存储时间