Django ORM: obtiene el objeto anterior más reciente que cumple una determinada condición

StackOverflow https://stackoverflow.com/questions/464206

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!

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top