【问题标题】:How can I filter distinct values from one column in a Django queryset without PostgreSQL?如何在没有 PostgreSQL 的情况下从 Django 查询集中的一列中过滤不同的值?
【发布时间】:2019-03-26 14:30:11
【问题描述】:

所以我有一个数据库来跟踪某些维基百科的编辑。在某些需要的情况下,数据库可能会多次将相同的编辑保存到数据库中,其中一列具有不同的值。

我希望能够创建一个基于rc_id 列删除重复行的查询集,这与重复编辑相同。我不在乎哪些重复行被丢弃,因为我只需要非唯一信息。

如果我使用的是 PostgreSQL 数据库,我可以通过 queryset.objects.filter(field=filter).distinct('rc_id') 使用 DISTINCT ON 功能。但是,在 MySQL 中,此功能不可用。

已通过告诉人们使用.values_list('rc_id').distinct() 回答了有关此主题的其他 SO 问题,但是我希望结果仍然是用于进一步过滤的查询集,而不是值列表。如何在查询集级别执行此操作,或者在必要时使用原始 SQL 查询?

【问题讨论】:

  • values_list的返回值是一个QuerySet,它支持filter。你能举一个不适合你的特定代码的例子吗?
  • 嗯。我做了ordered_queryset = queryset.order_by('-timestamp').values_list('domain', 'timestamp', 'username', 'page_title', 'edit_summary', 'rc_id').distinct() 和后来的ordered_queryset.order_by('timestamp')[0].timestamp.date(),在添加values_list 组件之前效果很好,但现在引发了错误'tuple' object has no attribute 'timestamp'
  • 我刚刚找到了named=True 选项,现在一切正常。感谢您对答案的推动!

标签: python django


【解决方案1】:

感谢上面的 Håken Lid,我的解决方案如下:

ordered_queryset = queryset.order_by(
    '-timestamp').values_list(
        'domain', 'timestamp', 'username', 'page_title', 'edit_summary', 'rc_id', named=True
            ).distinct()

为了澄清,对于重复编辑,values_list 中的每个值都是相同的,我省略了唯一的列。因此,这会返回一个包含正确过滤行的查询集。

【讨论】:

    猜你喜欢
    • 2017-04-10
    • 2011-07-02
    • 1970-01-01
    • 2019-01-14
    • 1970-01-01
    • 2022-01-21
    • 2018-07-07
    • 2018-06-05
    • 2019-04-23
    相关资源
    最近更新 更多