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.

Cómo sumar tiempo basado en un tiempo dado en Django?

class Clock(models.Model):
    report_submitted_at = models.TimeField()
    delivery_time = models.TimeField(null=True, blank=True)

Soy nuevo en Django, así que me gustaría saber cómo lograr esto. En mi modelo, ingreso la hora en la que se presenta el informe.
Según la hora ingresada, quiero guardar automáticamente la hora de entrega. La hora de entrega siempre es ’04:00:00′. Así que supongamos que ingresé la hora de presentación del informe como ’02:00:00′. La hora de entrega será ’06:00:00′ para esa fila.

Importé datetime. Manualmente puedo agregar dos horas. Pero aquí, ¿cómo puedo guardar automáticamente la hora de entrega? Cualquier ayuda sería muy apreciada. ¡Gracias!

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para lograr esto en Django, puedes usar la señal pre_save para definir el campo delivery_time antes de que se guarde el modelo.

    Primero, importa el módulo datetime y conecta la señal en el modelo Clock:

    from django.db.models.signals import pre_save
    from django.dispatch import receiver
    import datetime
    
    class Clock(models.Model):
        report_submitted_at = models.TimeField()
        delivery_time = models.TimeField(null=True, blank=True)
    
        # Conecta la señal
        @receiver(pre_save, sender='myapp.Clock')
        def set_delivery_time(sender, instance, **kwargs):
            # Verifica si delivery_time no está asignado
            if instance.delivery_time is None:
                # Asigna delivery_time como report_submitted_at + 4 horas
                instance.delivery_time = (datetime.datetime.combine(datetime.date.today(), instance.report_submitted_at) + datetime.timedelta(hours=4)).time()
    

    La función set_delivery_time está definida como un receptor de señales y está conectada a la señal pre_save del modelo Clock. Esta función verifica si el campo delivery_time no está asignado y lo calcula basado en el campo report_submitted_at.

    La línea datetime.datetime.combine(datetime.date.today(), instance.report_submitted_at) crea un objeto datetime para la fecha de hoy con la hora de report_submitted_at. La línea datetime.timedelta(hours=4) agrega 4 horas a este objeto datetime. Finalmente, el método .time() devuelve la parte de la hora del objeto datetime.

    Ahora, cada vez que se guarde un objeto Clock, la función set_delivery_time se llamará automáticamente y asignará el campo delivery_time si no está asignado.

    Espero que esto sea de ayuda. Avísame si tienes alguna pregunta.

Comments are closed.