Django ORM: obtiene el objeto anterior más reciente que cumple una determinada condición
-
19-08-2019 - |
Pregunta
Dado un objeto como:
class M(models.Model):
test = models.BooleanField()
created_date = models.DateTimeField(auto_now_add=True)
Datos de muestra dados (supongamos que aumenta de forma monotónica la creación automática de fecha_funcional):
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()
¿Se puede usar el ORM de Django para crear una consulta que devolvería X (la consulta anterior, por fecha, donde 'prueba' = Verdadero), si recibe Y? Si es así, ¿cómo?
En otras palabras: Dada Y, ¿cómo se obtiene el elemento anterior más reciente donde 'prueba' es Verdadero?
Pensamientos y amp; comentarios son apreciados, gracias!
Solución
Prueba esto
M.objects.filter(created_date__lte=Y.created_date).filter(test=True)[0:1]
También puede agregar una cláusula order_by como
M.objects.filter(created_date__lte=Y.created_date)\
.filter(test=True)\
.order_by('-created_date')[0:1]
Esto debería funcionar.
Otros consejos
Con la ayuda de búsquedas de campo de Django , puede lograr algo en el sentido de lo que desea con la siguiente expresión:
M.objects.filter( test=True, created_date__lt=Y.created_date ).order_by( '-created_date' )
Dependiendo de si hay o no elementos en el objeto de conjunto de consultas resultante, puede elegir el primero que será el objeto más reciente que desee.