gpt4 book ai didi

python - Django ORM 按表达式排序

转载 作者:太空狗 更新时间:2023-10-30 02:57:15 26 4
gpt4 key购买 nike

嗨,我可以在 ORM 中按 < 2 订购我唯一的想法是:

players = GamePlayer.objects.raw('SELECT * FROM `Farmer_gameplayer` WHERE (`Farmer_gameplayer`.`game_id` = %d) ORDER BY `turn` < %d' % (game.pk, game.turn))

我想点这个:

players = GamePlayer.objects.filter(game=game) ORDER BY `turn` < 2

最佳答案

注意:您可以调整您的应用程序以使用 ORDER BY turn ,作为 定性 结果集与 ORDER by turn < 2 没有太大区别.您只会看到 ORDER BY turn 的不同之处。将根据其 turn 更改所有行的排序列,同时 ORDER BY turn < 2按 bool 表达式 turn < 2 排序这不会对除此之外的所有行进行重新排序。下面我将介绍如何使用表达式对 Django 查询集进行排序,例如turn < 2

用表达式注释,然后按它排序:

想法是注释一个名为 turn_is_less_than_2 的字段那去either True or False , 然后按它排序。所述注释将表示表达式 turn < 2您想稍后订购 ( ORDER BY turn < 2 )

from django.db.models import Case, When, BooleanField

GamePlayer.objects.filter(game=game).annotate(turn_is_less_than_2=Case(
When(turn__lt=2, then=True),
default=False,
output_field=BooleanField()
)).order_by('turn_is_less_than_2')

# or order_by('-turn_is_less_than_2') for DESC order instead of ASC

分解解释:

首先我只是回答你的问题

GamePlayer.objects.filter(game=game)

然后我要做的是用一个字段对其进行注释 turn_is_less_than_2那是 True如果turn < 2 , 和 False否则

GamePlayer.objects.filter(game=game).annotate(turn_is_less_than_2=...)

然后当我们注释了过滤的查询集后,我们现在可以按该字段排序:

GamePlayer.objects.filter(game=game).annotate(...).order_by('turn_is_less_than_2')

关于python - Django ORM 按表达式排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37734942/

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