繁体   English   中英

如何在 Django 中更新多个对象

[英]How to update multiple objects in django

当注册日期达到6天以上时,我想同时更新多个对象:

想法是将每个对象的所有 issue_status 从“正在进行”更新为“待处理”

有必要迭代吗?

以下是我当前的代码和错误:

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

视图.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() 返回了不止一个维护问题——它返回了 61!

要一次性更新所有对象,您需要创建一个查询来选择要更新的所有对象,然后对其调用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')

在:

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

你可以用一行来完成它会快得多

MaintenanceIssue.objects.filter(issue_status='On Going').update(issue_status = "Pending")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM