es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Django ORM datos basados en el grupo de maxima fecha.

clase cotización(models.Model):
    id = models.AutoField(primary_key=True)
    stock = models.ForeignKey(stock, related_name='stock', on_delete=models.CASCADE)
    precio = models.DecimalField(max_digits=30, decimal_places=5)
    valido_hasta = models.DateTimeField()
    creado_en = models.DateTimeField() #tiempo
    actualizado_en = models.DateTimeField(blank=True, null=True)

Datos de ejemplo:

id stock precio valido_hasta creado_en
1. 1.    200.  09 Abril.   09 Abril 
2. 1.    300.  10 Abril.   09 Abril 
3. 2.    100.  07 Abril.   07 Abril 
4. 2.    200.  08 Abril.   08 Abril 

Resultado deseado:

id stock precio valido_hasta creado_en
2. 1.    300.  10 Abril.   09 Abril 
4. 2.    200.  08 Abril.   08 Abril 

Necesito sólo el registro con la fecha más reciente para cada stock.

Actualmente estoy haciendo:

quote.objects.values('stock_symbol').annotate(max_fecha=Max('valido_hasta'))

Pero aún no logro encontrar la solución adecuada.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para obtener el resultado deseado, puedes modificar la consulta actual y agregar una consulta más para obtener los objetos de cotización con la fecha máxima para cada acción. Aquí está el código modificado:

    from django.db.models import Max
    
    # Primera consulta para obtener la fecha máxima para cada acción
    max_dates = quote.objects.values('stock_id').annotate(max_date=Max('valid_till'))
    
    # Lista para almacenar el resultado final
    output = []
    
    # Segunda consulta para obtener los objetos de cotización con la fecha máxima para cada acción
    for max_date in max_dates:
        quote_obj = quote.objects.filter(stock_id=max_date['stock_id'], valid_till=max_date['max_date']).first()
        output.append(quote_obj)
    
    # Imprimir el resultado
    for quote_obj in output:
        print(quote_obj.id, quote_obj.stock_id, quote_obj.price, quote_obj.valid_till, quote_obj.created_at)
    

    Este código primero realiza una consulta a la tabla quote para obtener la fecha máxima para cada acción utilizando la función annotate. Luego, recorre el resultado de la primera consulta y realiza otra consulta a la tabla quote para obtener el objeto de cotización con la fecha máxima para cada acción utilizando la función filter. Por último, agrega el objeto de cotización a una lista de resultados y lo imprime.

    ¡Espero que esto te ayude!

Comments are closed.