Как обновить несколько объектов в django

Я хотел бы обновить несколько объектов одновременно, когда дата регистрации достигает более 6 дней:

Идея заключается в обновлении всех issue_status с 'On Going' на 'Pending' для каждого объекта

Нужно ли его итерировать?

Ниже приведен мой текущий код и ошибка:

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_diff

views.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() вернула более одного MaintenanceIssue - она вернула 61!

at:

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()

следует фильтровать по полю, а затем циклически просматривать каждое

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()

Чтобы обновить все объекты за один раз, вам нужно создать запрос, который выбирает все объекты, которые вы хотите обновить, затем вызвать update на нем

MaintenanceIssue.objects.filter(
    issue_status='On Going',
    register_dt__lt=datetime.datetime.now() - datetime.timedelta(days=6)
).update(issue_status='Pending')

Этот фильтр не совсем соответствует вашему свойству, следующий фильтр должен дать вам лучшее соответствие, хотя он немного уродливее

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')

вы можете сделать это одной строкой и это будет намного быстрее

MaintenanceIssue.objects.filter(issue_status='On Going').update(issue_status = "Pending")
Вернуться на верх