从 Django 查询集中过滤掉重复值和 none 值
Filtering out duplicate and none values from Django queryset
在 Django 应用程序中,我可以访问用户会话,然后使用 flat=True
获得 users_ids。例如。我在做:
Session.objects.filter(last_activity_gte=time_window).values_list('user_id',flat=True)
但是结果被重复项和 None
值污染了。如何执行相同的查询并过滤掉 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 对象进行访问
要排除空用户字段,请按 isnull
过滤。
(Session.objects
.filter(user__isnull=False)
.filter(last_activity_gte=time_window)
.values_list('user_id', flat=True))
要删除重复项,您可以使用 .distinct('user')
,但这仅适用于某些数据库后端。 MySQL好像不支持
在 Django 应用程序中,我可以访问用户会话,然后使用 flat=True
获得 users_ids。例如。我在做:
Session.objects.filter(last_activity_gte=time_window).values_list('user_id',flat=True)
但是结果被重复项和 None
值污染了。如何执行相同的查询并过滤掉 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 对象进行访问
要排除空用户字段,请按 isnull
过滤。
(Session.objects
.filter(user__isnull=False)
.filter(last_activity_gte=time_window)
.values_list('user_id', flat=True))
要删除重复项,您可以使用 .distinct('user')
,但这仅适用于某些数据库后端。 MySQL好像不支持