按django中ManyToMany字段的数量排序

时间:2012-01-12 18:12:30

标签: django django-models django-queryset

有没有人遇到这种类型的api电话有困难:

projects.annotate(votes_count=Count('votes')).order_by('votes_count') 

这对我来说非常缓慢,我发现了这个相关的问题:

https://code.djangoproject.com/ticket/17144

我想知道是否有其他人遇到与此相关的问题或是否有良好的解决方法?这似乎是一个普遍的api电话,我很惊讶这个bug没有更多的牵引力。

2 个答案:

答案 0 :(得分:1)

要解决此问题,您可以使用raw() SQL查询。这不是最漂亮的方式,但它会起作用。请参阅文档here

答案 1 :(得分:1)

该票专门提到了MySQL。我正在使用PostgreSQL并且一直使用注释而没有明显的缓慢。但是,我从来没有专门检查生成的SQL,看它是否正在做同样的事情。

如果您使用的是MySQL,您似乎可能会有以下选择(虽然它们都不是特别棒):

  1. 切换到PostgreSQL。如果我的轶事证据和票证中没有关于PostgreSQL的投诉是任何迹象,那么它可能不是问题。

  2. 暂时使用它,当它发布时升级到1.4。

  3. 运行主干以立即获得修复(通常不是一个好主意)或尝试修补当前安装。

  4. 使用raw()作为@jknupp建议。

  5. 4可能是目前最简单,最好的方法。除非你在将来的某个时候切换数据库引擎,否则这不是一个真正的问题,你可以随时在代码中给自己做一个注释,以便在更新Django时以正确的方式完成。我通常在类似的场景中做类似的事情:

    """Django has a bug in version 1.3 (see ticket:
    https://code.djangoproject.com/ticket/17144), resulting in unnecessary fields
    being included in the GROUP BY clause and subsequently very slow queries. The raw
    query below can be replaced with the commented line once the issue has been
    corrected.
    """
    # projects.annotate(votes_count=Count('votes')).order_by('votes_count')
    projects.raw(...)