Django获取在给定日期之前或之前符合条件的对象列表

时间:2017-03-17 13:03:14

标签: sql django django-models django-orm

我正在使用DJango 1.10,并拥有此模型

from django.contrib.auth.models import User

class ClientStatusHistory(models.Model):
    client = models.ForeignKey(to=User, related_name="status_history")
    date = models.DateTimeField(auto_now_add=True, db_index=True)
    status = models.BooleanField(db_index=True)

该表记录用户被标记为活动或非活动的时间。

我想选择在给定日期有效的用户列表。

如何使用django ORM执行此操作? 对不起,问题措辞不当;基本上我写这样的功能: get_users_active_on_date(date_value)

这是一个简单的例子: 假设我的系统只有一个用户ID为Id 1.用户从1月1日到20日活跃。然后在3月20日,他被标记为不活跃。 5月15日,他再次活跃起来。

因此,该表将有3个条目:

(1, Jan 1st, True),
(1, Mar 20th, False),
(1, May 15th, True)

因此,如果我查询3月1日的日期,它应该返回我[1],因为用户1在此期间处于活动状态。

然而,如果我查询3月30日,它应该返回我[],因为用户处于非活动状态。

1 个答案:

答案 0 :(得分:-1)

据我了解,您要求的内容可以这样做:

today = timezone.now().date()
result = ClientStatusHistory.objects.filter(date__date=today, status=True).values_list('id', flat=True)

但是有了先进的'像这样的查询,在Django Querysets and Managers的帮助下这样做会很有用,特别是如果您要在多个地方使用它(DRY!:):

class ClientStatusHistoryQuerySet(models.QuerySet):
    def users_active_on_date(self, d):
        return self.filter(date__date=d, status=True).values_list('id', flat=True)

class ClientStatusHistory(models.Model):
    ...

    objects = ClientStatusHistoryQuerySet.as_manager()

...

today = timezone.now().date()
result = ClientStatusHistory.objects.users_active_on_date(today)