У меня есть модель с полем position = PositiveIntegerField(unique=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()
(Причина в том, что + count
отрицательное число по модулю положительный один отрицательный в SQL.)
Это требует двух запросов к базе данных. Я подозреваю, что это можно сделать только в одном запросе, используя annotate
и Count
, но я не понял, как скомпоновать такой запрос. Можно ли это сделать, и если да, то как?