2

这是models.py

class CompetitionEntry(models.Model):
    submitter = models.ForeignKey(User)
    pic = models.ImageField(upload_to=images, blank=True, null=True)

class CompetitionEntryVote(models.Model):
    voted_entry = models.ForeignKey(CompetitionEntry)

class Entrylikes(models.Model):
    ip_address    = models.IPAddressField()
    liked_entry   = models.ForeignKey(CompetitionEntry)

这是views.py(我认为问题就在这里)

def show_all_entries(request, id):
    entries = CompetitionEntry.objects.filter(competition__id__exact=comp.id).annotate(vote_count=Count('competitionentryvote'), likes_count=Count('entrylikes'))

    return render(request, "show_all.html", {
        "entries": entries,
        })

show_all.html

{% for item in entries %}

Votes = {{item.vote_count}}   Likes= {{item.likes_count}}

{% endfor %}
  1. 这里的问题是输出中的投票和喜欢都是相同的。i,e 投票=喜欢=喜欢

  2. 如果我重写视图以仅显示投票或喜欢中的一个,则该页面可以完美运行。

  3. views.py中,如果我使用entries = CompetitionEntry.objects.filter(competition__id__exact=comp.id).annotate(vote_count=Count('competitionentryvote')).annotate(likes_count=Count('entrylikes')) 我得到与上面1相同的结果

4

1 回答 1

4

聚合通过Count映射到 SQLCOUNT()表达式来工作。请参阅此处的文档

由于您提供的查询将只为整个查询产生一组行,因此COUNT()在您的情况下,值可能是相同的。您可以尝试distinct=True按照文档中的建议进行设置:

如果 distinct=True,计数将仅包括唯一实例。这是 COUNT(DISTINCT) 的 SQL 等效项。默认值为假。

IE

CompetitionEntry.objects.filter(...).annotate(vote_count=Count('competitionentryvote', distinct=True))
   .annotate(likes_count=Count('entrylikes', distinct=True))
于 2013-05-27T18:39:09.590 回答