【问题标题】:How to update multiple objects in django如何在 django 中更新多个对象
【发布时间】:2021-11-09 13:12:30
【问题描述】:

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

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

有必要迭代吗?

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

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!

【问题讨论】:

    标签: python django orm


    【解决方案1】:

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

    【讨论】:

    • 感谢您提供这个非常优雅的解决方案
    【解决方案2】:

    在:

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

    【讨论】:

      【解决方案3】:

      一根线就能搞定,速度会快很多

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-01
        • 2017-05-06
        • 2021-03-05
        • 1970-01-01
        • 2016-12-18
        • 1970-01-01
        相关资源
        最近更新 更多