Python Django:在查询集上使用注释、计数和区分

Python Django:在查询集上使用注释、计数和区分,python,django,Python,Django,以下是我的数据库查询: results = Attachments.objects.filter(currency='current').annotate(num_attachments=Count('article_id')).order_by("num_attachments").distinct('article_id') 该查询细分如下(据我所知): 第一个过滤器是“当前”的当前附件 然后计算具有特定“article_id”的附件的数量 然后在每个附件上加上附件编号,并加上与文章id

以下是我的数据库查询:

results = Attachments.objects.filter(currency='current').annotate(num_attachments=Count('article_id')).order_by("num_attachments").distinct('article_id')
该查询细分如下(据我所知):

  • 第一个过滤器是“当前”的当前附件
  • 然后计算具有特定“article_id”的附件的数量
  • 然后在每个附件上加上附件编号,并加上与文章id相同的附件编号
  • 然后根据附件的数量进行排序
  • 然后,用distinct将列表向下划分,这样每个article_id值都有一个附件对象
我在PostgreSQL上运行这个,所以根据Django,我可以基于字段运行distinct()

执行查询时没有错误,但当我尝试迭代甚至打印结果时,Django debug会引发以下错误:

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.
文件“”,第1行,在
文件“/Users/Pat/.virtualenvs/envsp/lib/python2.7/site packages/django/db/models/query.py”,第118行,结果文件
self._fill_cache()
文件“/Users/Pat/.virtualenvs/envsp/lib/python2.7/site packages/django/db/models/query.py”,第875行,在缓存中
self.\u result\u cache.append(self.\u iter.next())
迭代器中的文件“/Users/Pat/.virtualenvs/envsp/lib/python2.7/site packages/django/db/models/query.py”,第291行
对于编译器.results\u iter()中的行:
文件“/Users/Pat/.virtualenvs/envsp/lib/python2.7/site packages/django/db/models/sql/compiler.py”,第763行,结果文件
对于self.execute_sql(多)中的行:
文件“/Users/Pat/.virtualenvs/envsp/lib/python2.7/site packages/django/db/models/sql/compiler.py”,第808行,在execute_sql中
sql,params=self.as_sql()
as_sql中的文件“/Users/Pat/.virtualenvs/envsp/lib/python2.7/site packages/django/db/models/sql/compiler.py”,第107行
“注释()+不同的(字段)未实现。”)
NotImplementedError:annotate()+未实现不同的(字段)。

有人知道这里发生了什么吗?

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

例如,如果您想知道给定的
'filename'
有多少篇文章,您可以这样做:

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

我找到了另一种方法,如何克服这一问题-使用子查询:

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

在Django中,这实际上是一个数据库查询。

看起来很简单
NotImplementedError
是Django异常。代码提高了它,让您知道此时不能将
注释
不同的
(带字段)组合在一起,这意味着它现在不起作用。他们将来可能会解决与之相关的任何问题,但现在你运气不好。您可以随时求助于
raw
并做任何您想做的事情。在上面的代码示例中,在order\u by和distinct字段之间缺少一个“.”点。@Chris有没有其他方法(除了raw SQL)来完成同样的事情?@Mikael谢谢,修复了。这只是堆栈中的一个输入错误,更正后的版本会产生相同的结果。