<p>列出的查询总是给出1的原因是您没有按日期分组。基本上,您已经要求数据库获取一周中某一天的<code>MessageLog</code>行。对于每一行,计算它有多少id(总是1)。然后取所有这些计数的平均值,当然也是1。</p>
<p>通常,需要使用<a href="https://docs.djangoproject.com/en/dev/topics/db/aggregation/#values" rel="nofollow noreferrer">^{<cd2>}</a>子句在<code>annotate</code>和<code>aggregate</code>部分之前对<code>MessageLog</code>行进行分组。但是,由于您的<code>logtime</code>字段是一个日期时间,而不仅仅是一个日期,所以我不确定您是否可以用Django的ORM直接表示它。您肯定可以使用<code>extra</code>子句来完成,如<a href="https://stackoverflow.com/questions/2278076/count-number-of-records-by-date-in-django">here</a>所示。或者,如果您喜欢,可以在SQL中声明一个视图,其中包含您喜欢的聚合和平均数学量,并为它声明一个非托管模型,然后正常使用ORM。</p>
<p>因此,一个<code>extra</code>字段可以获得每一天的记录总数,但不处理聚集计算的注释的平均值。我认为这可能是从模型中充分抽象出来的,您必须使用原始SQL查询,或者至少我在一个调用中找不到任何使其工作的东西。</p>
<p>也就是说,您已经知道如何在问题中显示的简单查询中获取每个工作日的总记录数。</p>
<p>这个查询将告诉您在给定的工作日有多少不同的日期记录:</p>
<pre><code>MessageLog.objects.filter(logtime__week_day=i).dates('logtime', day').count()
</code></pre>
<p>所以你可以用Python来计算平均值,这可能比尝试正确使用SQL要简单得多。</p>
<p>或者,此查询将在一个查询中获取所有工作日的原始邮件数,而不是for循环:</p>
<pre><code>MessageLog.objects.extra({'weekday': "dayofweek(logtime)"}).values('weekday').annotate(Count('id'))
</code></pre>
<p>但是我还没有得到一个好的查询来为每个工作日提供不同日期的计数注释到那个日期querysets失去了处理注释调用的能力,并且在一个<code>extra</code>值上注释似乎也不起作用。</p>
<p>考虑到SQL表达式并没有那么难,这一点非常棘手。</p>