我有一個字段爲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
,但我還沒有弄清楚如何將這樣的查詢放在一起。它可以完成,如果是這樣,如何?