我有以下型号:
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?
更新:实际上我在投票中还有三个字段:game
,turn
和type
(我将它们添加到上面的代码中),我需要根据以下内容选择获胜者给定特定game
,turn
和type
的先前约束(即类似.filter(game=1, step=2, type=3)
)
答案 0 :(得分:3)
您可以使用注释为每个用户选择投票计数和最早投票时间,然后按注释字段排序并选择第一个:
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。