日時フィールドを持つモデルがあります。特定の日時 - DTが与えられたら、DTに最も近い日時を持つオブジェクトを取得する必要があります。これは可能ですか?指定された日時に最も近い日時のフィルタ
おかげで、
次の2つのクエリといくつかのロジックでそれを得ることができます日時フィールドを持つモデルがあります。特定の日時 - DTが与えられたら、DTに最も近い日時を持つオブジェクトを取得する必要があります。これは可能ですか?指定された日時に最も近い日時のフィルタ
おかげで、
次の2つのクエリといくつかのロジックでそれを得ることができます:
アイデアは1直後のオブジェクトと、1つ前のターゲット日時およびそれらのいずれかを返すを見つけることです。
# this method is on the model's manager
def get_closest_to(self, target)
closest_greater_qs = self.filter(dt__gt=target).order_by('dt')
closest_less_qs = self.filter(dt__lt=target).order_by('-dt')
try:
try:
closest_greater = closest_greater_qs[0]
except IndexError:
return closest_less_qs[0]
try:
closest_less = closest_less_qs[0]
except IndexError:
return closest_greater_qs[0]
except IndexError:
raise self.model.DoesNotExist("There is no closest object"
" because there are no objects.")
if closest_greater.dt - target > target - closest_less.dt:
return closest_less
else:
return closest_greater
1つのクエリで取得するには、ORMから生のSQLを削除する必要があります。
'target'は' self.filter(dt__gt = target).order_by( 'dt') 'で何を参照すべきですか? – alias51
これはタイプミスです、ありがとうございます。 'target'は' get_closest_to'のパラメータです。 –
'Model.objects.order_by( ' - datetime')。filter(datetime__ge = DT)[0]'のようなものがあると仮定します。 –