【问题标题】:Filtering out duplicate and none values from Django queryset从 Django 查询集中过滤掉重复值和无值
【发布时间】:2017-02-17 04:33:46
【问题描述】:

在 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 对象访问

【问题讨论】:

    标签: django django-queryset django-orm


    【解决方案1】:

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

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

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

    【讨论】:

    • 顺便说一句,values_listdistinct 这样一起使用可以吗?
    • 是的,这是可能的。
    • .exclude(user=None)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-16
    • 1970-01-01
    • 1970-01-01
    • 2019-07-12
    • 1970-01-01
    • 2018-01-21
    相关资源
    最近更新 更多