Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 这可以简化为一个查询吗?_Python_Django_Django Models - Fatal编程技术网

Python 这可以简化为一个查询吗?

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

我有一个模型,其字段位置=PositiveIntegerFieldunique=True。给定此模型的一个实例,我希望获得具有下一个最高位置的实例,并使用某些过滤器。如果此实例是位置最高的实例,我希望将其换行为0并返回位置最低的实例;如果这个实例是唯一的一个,我想返回它自己

这是我的密码:

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