【问题标题】:Django How to bulk update on all child objects?Django 如何批量更新所有子对象?
【发布时间】:2023-03-29 22:39:01
【问题描述】:

我正在 django 上构建帮助台系统。任何人都可以为客户支持开票。 假设我有一个父对象 #001,并且该父对象的每个子对象都具有相同的票证 ID。请参阅屏幕截图以更好地理解:

child1 和 child2 具有与其父对象相同的票证 ID。如果它们具有相同的票证 ID,如何对所有对象应用批量更新?假设如果我更改 child2 的票证状态,那么我希望它也将应用 child1 和父对象的批量更新。知道如何在 django 上做到这一点吗? 这是我的代码:

models.py

class Contact(models.Model):
       choice = (("pending","pending"),("solved","solved"),("closed","closed"))
       ticket_status = models.CharField(choices=choice,max_length=100,default="pending")
       parent =models.ForeignKey('self', on_delete=models.CASCADE,
                  null=True, blank=True, related_name='contact_parent')
       sno = models.AutoField(primary_key=True,)


       def save(self,*args,**kwargs):
          if not self.parent and not self.support_ticket:
              self.support_ticket= str(rand_support_ticket())
          if not self.support_ticket:
               self.support_ticket = self.parent.support_ticket
          
       
          
          super(Contact,self).save(*args,**kwargs)
    

forms.py

class SupportAgentFrom(forms.ModelForm):
     class Meta:
         model = Contact
         fields = ['support_message','ticket_status']   

views.py

def AddReplySupport(request,slug):

    # fetch the object related to passed id
    obj = get_object_or_404(Contact, slug = slug)

    # pass the object as instance in form
    form = SupportAgentFrom(request.POST or None, instance = obj)   
    if form.is_valid():
        form.instance.support_agent = request.user
        form.save()

现在我一次只能更新一个对象。如果它们具有相同的票证 ID,我想一次对多个对象应用批量更新。

#Update1 最终我的问题在遵循 Dan Yishai 解决方案后得到解决。在这里,我想稍微解释一下他的代码,以便人们能够理解并解决我面临的此类类似问题。

Contact.objects.filter(
                      Q(support_ticket=form.instance.support_ticket) 
                  ).update( ticket_status="closed")

上面的代码只搜索和更新那些具有完全相同票证ID的对象。

【问题讨论】:

    标签: python-3.x django


    【解决方案1】:

    您可以在单个查询中更新项目及其所有子项,只需将 if 中的代码替换为以下内容:

    count = Contact.objects.filter(
        Q(pk=form.instance.pk) | Q(parent_id=form.instance.pk)
    ).update(support_agent=request.user)
    

    您可以使用count 来验证至少有1 个对象已被更新,并向用户显示修改了多少个对象。

    【讨论】:

    • 丹以晒谢谢。在对您的代码稍作修改后,它就可以工作了。你给出了非常简单易行的解决方案。再次感谢。
    • 你改进了什么?所以我们可以为任何未来的观众改变答案​​......
    • 查看我更新的问题。我只是更改了字段名称
    【解决方案2】:

    下面我假设sno 是票证ID
    获取查询集:

    queryset = Contact.objects.filter(sno=form.instance.sno)
    

    现在您可以使用.update().bulk_update()

    更新每个对象以拥有相同的支持代理:

    queryset.update(support_agent=request.user)
    

    更新每个对象以拥有不同的支持代理:

    for contact in queryset:
        contact.support_agent = value
    
    queryset.bulk_update['support_agent']
    

    【讨论】:

    • 我将为value 插入的内容。这个链接的实际价值是多少contact.support_agent = value
    • 在这个特定示例中,您不需要使用 bulk_update。但是,如果您想为每个对象更改一个字段并希望为每个对象的该字段分配不同的值,那么 bulk_update 就很有用了
    猜你喜欢
    • 2016-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-11
    • 1970-01-01
    • 2012-09-21
    相关资源
    最近更新 更多