gpt4 book ai didi

django - 是否可以使用复杂查询注释 Django ORM 查询

转载 作者:行者123 更新时间:2023-12-04 06:38:00 24 4
gpt4 key购买 nike

我有三个模型,Contender、Week 和 Vote,每个竞争者都可以根据周进行投票,

class Contender(models.Model)
week = models.ManyToManyField(Week)

class Week(models.Model):
date_start = models.DateField()

class Vote(models.Model):
contender = models.ForeignKey(Contender)
week = models.ForeignKey(Week)

我想向 Contender 添加一些东西,所以我这样做了:
c = Count('vote', vote__week__date_start = "2011-01-03")
contenders = Contender.objects.all().annotate(vote_count=c).order_by('-vote_count')
contenders[0].vote_count

问题是,当我为另一个 Week(具有不同的 date_start)添加投票时,.vote_count 值会发生变化,因此我传递给 Count 对象的额外参数似乎无关紧要。

我如何在 Django ORM 中做这种类型的注释?

最佳答案

你可以从投票开始:

votes = Vote.objects.filter(week__date_start = "2011-01-03")      \
.values_list('contender') \
.annotate(cnt=Count('week')).order_by('-cnt')
contender_pks = [d[0] for d in votes]
contenders_dict = Contender.objects.in_bulk(contender_pks)

contenders = []
for pk, vote_count in votes:
contender = contenders_dict[pk]
contender.vote_count = vote_count
contenders.append(conteder)

此外,您可以进行一些非规范化 - 添加
class VoteCount(models.Model):
contender = models.ForeignKey(Contender)
week = models.ForeignKey(Week)
count = models.IntegerField(default=0)

并计算其中的选票(覆盖 Vote.save() 或使用 post_save 信号),然后您只需执行以下操作:
VoteCount.objects.filter(week__date_start = "2011-01-03") \
.select_related('contender') \
.order_by('-count')

如果你经常做这样的统计,性能会更高效。

关于django - 是否可以使用复杂查询注释 Django ORM 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4630349/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com