2013-04-06 23 views
10

Ich habe ein Modell mit einem Datetime-Feld. Jetzt, da ein bestimmtes Datum - DT, gegeben ist, muss ich das Objekt bekommen, welches die datetime am nächsten zu DT hat. Ist das möglich?Nach Datum filtern, das dem angegebenen Datum am nächsten ist

Danke,

+0

so etwas wie 'Model.objects.order_by ('- datetime'). Filter (datetime__ge = DT) [0] 'vorausgesetzt, Sie haben ein Element wie dieses. –

Antwort

10

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.

+0

Worauf sollte sich 'target' beziehen?' Self.filter (dt__gt = target) .order_by ('dt') '? – alias51

+0

Es ist ein Tippfehler, danke. 'target' ist der Parameter von' get_closest_to'. –

Verwandte Themen