Python 这可以简化为一个查询吗?
我有一个模型,其字段位置=PositiveIntegerFieldunique=True。给定此模型的一个实例,我希望获得具有下一个最高位置的实例,并使用某些过滤器。如果此实例是位置最高的实例,我希望将其换行为0并返回位置最低的实例;如果这个实例是唯一的一个,我想返回它自己 这是我的密码:Python 这可以简化为一个查询吗?,python,django,django-models,Python,Django,Django Models,我有一个模型,其字段位置=PositiveIntegerFieldunique=True。给定此模型的一个实例,我希望获得具有下一个最高位置的实例,并使用某些过滤器。如果此实例是位置最高的实例,我希望将其换行为0并返回位置最低的实例;如果这个实例是唯一的一个,我想返回它自己 这是我的密码: count = Player.objects.count() return Player.objects.filter(game_id=self.game_id, is_alive=True).annotat
count = Player.objects.count()
return Player.objects.filter(game_id=self.game_id, is_alive=True).annotate(
relative_position=(F('position') - self.position - 1 + count) % count
).order_by('relative_position')[:1].get()
+计数的原因是,在SQL中,负数模正数是负数
这需要两个数据库查询。我怀疑使用annotate和Count在一个查询中就可以实现这一点,但我还没有弄清楚如何将这样的查询放在一起。可以这样做吗?如果可以,怎么做?不一定只有一个查询,但它可能胜过两个查询和注释:
players = Player.objects.filter(game_id=self.game_id, is_alive=True).order_by('position')
try:
return players.filter(position__lt=self.position)[0]
except IndexError:
return players.last()
我发现Django 1.8中有条件查询表达式,这意味着我可以放弃模运算,这样做:
return Player.objects.filter(game_id=self.game_id, is_alive=True).order_by(
Case(When(position__gt=self.position, then=Value(0)), default=Value(1)),
'position'
)[:1].get()