这可以简化为单个查询吗?

时间:2015-04-22 23:48:50

标签: python django django-models

我有一个带有字段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>'只能在一个查询中执行此操作,但我还没弄清楚如何将这样的查询放在一起。可以这样做,如果是的话,怎么做?

2 个答案:

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