Как обновить несколько объектов в 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")