我有一个带有字段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()
的模型。给定此模型的一个实例,我想获得具有下一个最高位置的实例(受某些过滤器限制)。如果此实例是具有最高位置的实例,我想回绕到0并返回具有最低位置的实例;如果这个实例是唯一的,我想回归自己。
这是我的代码:
+ count
(annotate
的原因是因为在SQL中以正数为模的负数是负数。)
这需要两个数据库查询。我怀疑使用Count
和'<div id='unsafe'></div> unsafe2 <div id='unsafe3'></div>'
只能在一个查询中执行此操作,但我还没弄清楚如何将这样的查询放在一起。可以这样做,如果是的话,怎么做?
答案 0 :(得分:0)
并不总是只有一个查询,但它可能胜过2个查询和注释:
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()
答案 1 :(得分:0)
我发现条件查询表达式是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()