2009-01-21 6 views
2

Étant donné un objet comme:Django ORM: Obtenez le plus récent objet avant que rencontre une certaine condition

class M(models.Model): 
    test = models.BooleanField() 
    created_date = models.DateTimeField(auto_now_add=True) 

données échantillon donné (en supposant l'augmentation de façon monotone CREATED_DATE automatique):

M(test=False).save() 

M(test=True).save() 

M(test=False).save() 

X = M(test=True).save() 

M(test=False).save() 

Y = M(test=False).save() 

M(test=False).save() 

M(test=True).save() 

Peut-on utiliser la Django ORM pour créer une requête qui retournerait X (la requête précédente, par date, où 'test' = True), si vous avez Y? Si c'est le cas, comment? En d'autres termes: Étant donné Y, comment obtient-on l'élément précédent le plus récent où 'test' est True?

Réflexions & commentaires est apprécié, merci!

Répondre

6

Essayez cette

M.objects.filter(created_date__lte=Y.created_date).filter(test=True)[0:1] 

Vous pouvez également ajouter une clause order_by comme

M.objects.filter(created_date__lte=Y.created_date)\ 
     .filter(test=True)\ 
     .order_by('-created_date')[0:1] 

Cela devrait fonctionner.

3

Avec l'aide de Django field lookups, vous pourriez être en mesure de réaliser quelque chose à l'effet de ce que vous voulez avec l'expression suivante:

M.objects.filter(test=True, created_date__lt=Y.created_date).order_by('-created_date') 

Selon que il existe ou pas d'éléments dans le queryset résultant objet, vous pouvez prendre le tout premier qui sera l'objet le plus récent que vous voulez.

Questions connexes