Me gustaría actualizar más de un objeto al mismo tiempo, cuando la fecha de registro alcance más de 6 días:
La idea es actualizar todos los estados de problemas de 'En curso' a 'Pendiente' para cada objeto
¿Es necesario iterarlo?
A continuación se muestra mi código actual y el error:
models.py class MaintenanceIssue(models.Model): issue_status = models.CharField(max_length=30, choices=[('pending', 'Pending'), ('on going', 'On going'), ('done', 'Done')]) register_dt = models.DateTimeField(blank=True, null=True) @property def pending_issue(self): issue_time_diff = (datetime.now() - self.register_dt).days return issue_time_diffvistas.py:
on_going_issues = MaintenanceIssue.objects.get(issue_status='On Going') if on_going_issues.pending_issue > 6: on_going_issues.issue_status = 'Pending' on_going_issues.save()get() devolvió más de un problema de mantenimiento, ¡devolvió 61!
Para actualizar todos los objetos de una vez, deberá crear una consulta que seleccione todos los objetos que desea actualizar y luego llamar a update en él
MaintenanceIssue.objects.filter( issue_status='On Going', register_dt__lt=datetime.datetime.now() - datetime.timedelta(days=6) ).update(issue_status='Pending')Ese filtro no coincide exactamente con su propiedad, el siguiente debería brindarle una mejor coincidencia, aunque es un poco más feo
from django.db.models import F, Value from django.db.models.functions import ExtractDay MaintenanceIssue.objects.filter( issue_status='On Going' ).annotate( days=ExtractDay(Value(datetime.datetime.now()) - F('register_dt')) ).filter( days__gt=6 ).update(issue_status='Pending')en:
on_going_issues = MaintenanceIssue.objects.get(issue_status='On Going') if on_going_issues.pending_issue > 6: on_going_issues.issue_status = 'Pending' on_going_issues.save()debe filtrar por el campo y luego recorrer cada uno
on_going_issues = MaintenanceIssue.objects.filter(issue_status='On Going') for one in on_going_issues: if one.pending_issue > 6: one.issue_status = "Pending" one.save()puedes hacerlo con una línea y será mucho más rápido
MaintenanceIssue.objects.filter(issue_status='On Going').update(issue_status = "Pending")