Sie können es mit zwei Abfragen und einige Logik erhalten:
Die Idee ist, ein Objekt sofort finden unmittelbar nach und man die Zieldatetime vorhergehenden und einer von ihnen zurück:
# 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
Um es mit einer Abfrage zu erhalten, müssen Sie aus ORM auf Raw SQL verzichten.
so etwas wie 'Model.objects.order_by ('- datetime'). Filter (datetime__ge = DT) [0] 'vorausgesetzt, Sie haben ein Element wie dieses. –