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>
所以我希望你能回答我的问题:
问题
- 我的 annotate() 到底发生了什么?尽管我使用了 Count(),为什么它会重复行而不是对它们进行计数?
- 指望“词”和“word__word”是一回事吗?
- 这个问题是否与我的
KindleLookups
的 __str__
方法返回 self.usage
(找到单词的句子)而不是单词有关?
您应该改为注释 KindleWords
模型,因此:
context['lookup_counts'] = <strong>KindleWords</strong>.objects.annotate(
word_count=<strong>Count('kindlelookups')</strong>
)
从这个查询集中产生的 KindleWords
将有一个额外的属性 .word_count
决定 KindleWords
在 KindleLookups
中使用了多少次。
Note: normally a Django model is given a singular name, so KindleWord
instead of KindleWords
.
背景:
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>
所以我希望你能回答我的问题:
问题
- 我的 annotate() 到底发生了什么?尽管我使用了 Count(),为什么它会重复行而不是对它们进行计数?
- 指望“词”和“word__word”是一回事吗?
- 这个问题是否与我的
KindleLookups
的__str__
方法返回self.usage
(找到单词的句子)而不是单词有关?
您应该改为注释 KindleWords
模型,因此:
context['lookup_counts'] = <strong>KindleWords</strong>.objects.annotate(
word_count=<strong>Count('kindlelookups')</strong>
)
从这个查询集中产生的 KindleWords
将有一个额外的属性 .word_count
决定 KindleWords
在 KindleLookups
中使用了多少次。
Note: normally a Django model is given a singular name, so
KindleWord
instead of.KindleWords