Django:在查询集上使用注释,计数和区别

这是我的数据库查询:

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

该查询细分如下(据我了解):

>第一个过滤器是“当前”的当前附件.
>然后计算带有特定“ article_id”的那些附件的数量.
>然后用每个附件的数目和具有相同article_id的附件的数目注释每个附件.
>然后根据附件数量进行排名.
>然后,将列表与众不同的内容进行剖析,以便每个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.

有人知道这是怎么回事吗?

最佳答案
解决方法是使用values(‘distinct_fieldname’),因为这将使最终的SQL语句对该字段执行GROUP BY(您可以添加多个字段名),本质上是相同的.

例如,如果您想知道给定的“文件名”有多少篇文章,您可以这样做:

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

转载注明原文:Django:在查询集上使用注释,计数和区别 - 代码日志