复杂的Django模型查询

时间:2014-03-29 15:51:54

标签: python django models

我有以下型号:

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?

更新:实际上我在投票中还有三个字段:gameturntype(我将它们添加到上面的代码中),我需要根据以下内容选择获胜者给定特定gameturntype的先前约束(即类似.filter(game=1, step=2, type=3)

1 个答案:

答案 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