2012-08-06 63 views
9

这里是我的数据库查询:Django的:使用注释,计数和非重复上一个QuerySet

results = Attachments.objects.filter(currency='current').annotate(num_attachments=Count('article_id')).order_by("num_attachments").distinct('article_id') 

细分查询如下(据我所知):

  • 首先过滤器是当前附件这是“当前”。
  • 然后计算具有某个'article_id'的那些附件的数量。
  • 然后用每个附件的附件数量与具有article_id的附件数量进行注释。
  • 然后根据附件的数量进行排名。
  • 然后,使用distinct来削减列表,以便每个article_id值都有一个Attachment对象。

我在PostgreSQL上运行这个,所以根据Django docs,我可以根据字段运行distinct()。

没有任何错误,当我执行查询,但是当我尝试迭代,甚至打印以下错误是由Django的调试抛出的结果:

NotImplementedError at /function/ 
annotate() + distinct(fields) not implemented. 

从交互提示更详细的回溯是:

File "<console>", line 1, in <module> 
    File "/Users/Pat/.virtualenvs/envsp/lib/python2.7/site-packages/django/db/models/query.py", line 118, in _result_iter 
    self._fill_cache() 
    File "/Users/Pat/.virtualenvs/envsp/lib/python2.7/site-packages/django/db/models/query.py", line 875, in _fill_cache 
    self._result_cache.append(self._iter.next()) 
    File "/Users/Pat/.virtualenvs/envsp/lib/python2.7/site-packages/django/db/models/query.py", line 291, in iterator 
    for row in compiler.results_iter(): 
    File "/Users/Pat/.virtualenvs/envsp/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 763, in results_iter 
    for rows in self.execute_sql(MULTI): 
    File "/Users/Pat/.virtualenvs/envsp/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 808, in execute_sql 
    sql, params = self.as_sql() 
    File "/Users/Pat/.virtualenvs/envsp/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 107, in as_sql 
    "annotate() + distinct(fields) not implemented.") 
NotImplementedError: annotate() + distinct(fields) not implemented. 

任何人都知道这里发生了什么?

+2

似乎很简单。 'NotImplementedError'是一个Django异常。代码提高它,让你知道你现在不能将'annotate'和'distinct'结合在一起,这意味着它现在不能工作。他们可能会在未来解决任何与它有关的问题,但现在你运气不好。你总是可以诉诸“生吃”,做任何你想做的事情。 – 2012-08-06 15:48:31

+0

在上面的代码示例中,您缺少一个点“。”。在order_by和distinct字段之间。 – Mikael 2012-08-06 15:50:35

+0

@Chris关于另一个查询(除了原始SQL)完成同样的事情的任何想法? – Pat 2012-08-07 00:29:49

回答

5

解决方法是使用values('distinct_fieldname'),因为这会使该字段上的最终SQL语句执行GROUP BY(您可以添加多个字段名),它本质上是相同的。

举例来说,如果你想知道有多少篇对于一个给定'filename'你这样做存在:

results = Attachments.objects.filter(currency='current').values('filename').annotate(num_attachments=Count('article_id')).order_by("num_attachments")