Django annotate() 没有将条目数相加,而是重复它们

Django annotate() is not adding up the number of entries but is instead repeating them

背景:

Amazon Kindle PaperWhite 存储我们在读入名为 vocab.db 的 sqlite3 数据库时查找的单词。我正在开发一个小型的 kindle 配套应用程序,该应用程序采用此 db 文件并将其导入 django table 以进行各种处理。我已经完成了这一步。

我想做的事情:

我想查询我的tableKindleLookups我的最难的词(例如:我查了多少次特定的词) .我最终想以 table 按最高计数排序的方式呈现这些数据。

想要的结果:

Word Lookup Count
Reverberated 3
Troubadour 1
Corrugated 1

我的结果(不希望的):

此处 Reverberated 被重复三次,每次重复查找计数为 1,而不是一次重复查找计数为 3。

Word Lookup Count
Reverberated 1
Reverberated 1
Reverberated 1
Troubadour 1
Corrugated 1

型号:

class KindleLookups(TimeStampedModel):
    book = models.ForeignKey(KindleBookInfo, on_delete=models.CASCADE)
    word = models.ForeignKey(KindleWords, on_delete=models.CASCADE)
    ...

class KindleWords(TimeStampedModel):
    word_key = models.CharField(max_length=255, unique=True)
    word = models.CharField(max_length=255)
    ...

我正在尝试使用 annotate() 来完成此操作,但出于某种原因,这是重复行而不是将它们相加。

context['lookup_counts'] = KindleLookups.objects.annotate(word_count=Count("word"))

然后我想我需要在实际单词上注释,但似乎没有任何改变。

context['lookup_counts'] = KindleLookups.objects.annotate(word_count=Count("word__word"))

模板:

<tbody>
{% for word in lookup_counts %}
<tr>
    <td>{{ word.word }}</td>
    <td>{{ word.word_count }}</td>
</tr>
{% endfor %}
</tbody>

所以我希望你能回答我的问题:

问题

  1. 我的 annotate() 到底发生了什么?尽管我使用了 Count(),为什么它会重复行而不是对它们进行计数?
  2. 指望“词”和“word__word”是一回事吗?
  3. 这个问题是否与我的 KindleLookups__str__ 方法返回 self.usage(找到单词的句子)而不是单词有关?

您应该改为注释 KindleWords 模型,因此:

context['lookup_counts'] = <strong>KindleWords</strong>.objects.annotate(
    word_count=<strong>Count('kindlelookups')</strong>
)

从这个查询集中产生的 KindleWords 将有一个额外的属性 .word_count 决定 KindleWordsKindleLookups 中使用了多少次。


Note: normally a Django model is given a singular name, so KindleWord instead of KindleWords.