【问题标题】:Filter, then ordering and get distinct on queryset过滤,然后排序并在查询集上变得不同
【发布时间】:2019-10-04 21:29:40
【问题描述】:

我有一个代理列表,我想过滤这个列表,然后按他们写的 cmets 排序(如果代理写了评论,那么他应该出现在我列表的顶部)。问题是我在我的列表中获得了 3 倍相同的代理,因为他写了 3 个 cmets。

我尝试在查询末尾添加 distinct,但出现此错误: NotImplementedError: DISTINCT ON fields is not supported by this database backend

如果一个代理写了 x cmets,我的查询会产生 x 个代理

agents = Agent.objects.filter(name__icontains=name, metier__name__icontains=metier,
                                          code_uf__icontains=code_uf, grade_code__icontains=grade,
                                          matricule__icontains=matricule).order_by('-comments')

这里有不同的查询:

agents = Agent.objects.filter(name__icontains=name, metier__name__icontains=metier,
                                          code_uf__icontains=code_uf, grade_code__icontains=grade,
                                          matricule__icontains=matricule).order_by('-comments').distinct('comments')

我希望我的列表代理没有重复代理。列表类型应该是查询集(因为我在之后使用所有参数)。暂时我的名单中出现了 3 次相同的代理,因为他写了 3 个 cmets...

【问题讨论】:

  • 如果将distinct(...) 替换为aggregate(Count('comments')) 会怎样?
  • 您好,感谢您的评论。如果我用聚合替换,我会丢失我的代理列表,而是得到“cmets__count”。我需要一个没有重复的代理列表作为输出
  • 是的,我的错,那是个错误。看看那里,它可能会有所帮助:stackoverflow.com/questions/15626175/distinct-on-in-django
  • 我想要完整的对象。如果没有答案,我会像作者在他的答案中那样做。但我希望有更清洁的东西:)
  • 如果您遇到困难,请记住您仍然可以使用 SQL 查询 (Agent.objects.raw('SELECT name, metier... FROM prj_c GROUP BY name, metier...'))

标签: python django


【解决方案1】:

好的,经过更多研究,我找到了解决方案。我在这个annotate 上使用了annotate,然后是order_by

agents = Agent.objects.filter(name__icontains=name, metier__name__icontains=metier,
                                          code_uf__icontains=code_uf, grade_code__icontains=grade,
                                          matricule__icontains=matricule).annotate(temp_date=Max("comments__date_created")).order_by("-temp_date") 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-08
    • 1970-01-01
    • 2016-07-01
    • 2015-01-24
    • 2022-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-08
    相关资源
    最近更新 更多