从Django queryset中过滤掉重复值和无值

时间:2016-10-08 07:09:25

标签: django django-queryset django-orm

在Django应用程序中,我可以访问用户会话,然后使用flat=True获取users_ids。例如。我在做:

Session.objects.filter(last_activity_gte=time_window).values_list('user_id',flat=True)

但结果受到重复和None值的影响。如何执行相同的查询并过滤掉无或重复?

一种方法是:

time_window = timezone.now() - timedelta(minutes=5)
user_ids = Session.objects.filter(last_activity_gte=time_window).values_list('user_id',flat=True)
user_ids = [id for id in user_ids if id is not None]
user_ids = set(user_ids)

但是我想知道在查询数据库时我是否可以直接实现这一点,这会更快。表现至关重要。

如果有人有兴趣,我正在使用https://github.com/Bouke/django-user-sessions来访问Django会话对象作为ORM对象

1 个答案:

答案 0 :(得分:4)

要排除空用户字段,请按isnull进行过滤。

(Session.objects
    .filter(user__isnull=False)
    .filter(last_activity_gte=time_window)
    .values_list('user_id', flat=True))

要删除重复项,可以使用.distinct('user'),但这仅适用于某些数据库后端。 MySQL似乎不支持它。