我有以下模型:
class Vote(models.Model):
voter = models.ForeignKey(User)
target = model.ForeignKey(User)
timestamp = models.DateTimeField()
game = models.ForeignKey(Game)
step = model.IntegerField()
type = models.ForeignKey(VoteType)
我需要选择投票最多的目标,如果出现平局,则选择最早获得投票的目标。是否可以使用 Django ORM?
更新:实际上我在 Vote 中还有另外三个字段:game、turn 和 type(我将它们添加到上面的代码中) ,我需要根据给定特定 game、turn 和 type(即类似 .filter (游戏=1,步骤=2,类型=3))
请您参考如下方法:
可以使用annotation选择每个用户的投票数和最早投票时间,然后按annotations字段排序,选择第一个:
from django.db.models import Count, Min
winner = User.objects.annotate(vote_count=Count('vote_set'))\
.annotate(first_vote_time=Min('vote_set__timestamp'))\
.order_by('-vote_count', 'first_vote_time')[0]
更新: 您可以应用以下过滤器来仅计算特定游戏的投票数:
.filter(vote_set__game=game, vote_set__step=step, vote_set__type=type)
双下划线允许您过滤相关对象的属性。
请务必在注释之前应用过滤器,以便只计算正确的投票,并确保投票的所有过滤条件都在同一个过滤器调用中。解释了为什么必须执行后者 here .
