如何更新django中的多个对象
How to update multiple objects in 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() returned more than one MaintenanceIssue -- it returned 61!
在:
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")
我想同时更新多个对象,当注册日期超过 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() returned more than one MaintenanceIssue -- it returned 61!
在:
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")