Django ORM: Obtenir le dernier objet antérieur qui répond à une certaine condition
-
19-08-2019 - |
Question
Étant donné un objet tel que:
class M(models.Model):
test = models.BooleanField()
created_date = models.DateTimeField(auto_now_add=True)
Exemple de données (supposons que la valeur automatique de created_date augmente de manière monotone):
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 l'ORM de Django pour créer une requête qui renverrait X (la requête précédente, par date, où 'test' = True), si on vous donne Y? Si oui, comment?
En d'autres termes: étant donné Y, comment obtient-on l'élément précédent le plus récent où 'test' est vrai?
Pensées & amp; les commentaires sont appréciés, merci!
La solution
Essayez ceci
M.objects.filter(created_date__lte=Y.created_date).filter(test=True)[0:1]
Vous pouvez également ajouter une clause order_by telle que
M.objects.filter(created_date__lte=Y.created_date)\
.filter(test=True)\
.order_by('-created_date')[0:1]
Cela devrait fonctionner.
Autres conseils
Avec l'aide de recherches de champ Django , vous pourrez peut-être obtenir quelque chose qui donne 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 qu'il existe ou non des éléments dans l'objet queryset résultant, vous pouvez choisir le tout premier qui sera l'objet le plus récent que vous souhaitez.