Skip to main content
 首页 » 编程设计

python之复杂的 Django 模型查询

2024年08月27日32JeffreyZhao

我有以下模型:

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 .