Django Как выполнить массовое обновление всех дочерних объектов?

Я создаю систему справочной службы на django. Где любой может открыть тикет для поддержки клиента. Предположим, у меня есть родительский объект #001 и все дочерние объекты этого родителя имеют одинаковый id тикета. Для лучшего понимания смотрите скриншот: enter image description here

child1 и child2 имеют одинаковый идентификатор билета, как и их родительский объект. Как применить массовое обновление для всех объектов, если у них одинаковый идентификатор билета? Предположим, если я изменю статус тикета для 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()

Сейчас я могу обновлять только один объект один раз за раз. Я хочу применить массовое обновление для нескольких объектов одновременно, если они имеют одинаковый идентификатор тикета.

Вы можете обновить элемент и все его дочерние элементы в одном запросе, просто замените ваш код внутри if на что-то вроде:

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

Вы можете использовать count для проверки того, что хотя бы 1 объект был обновлен, и показать пользователю, сколько объектов было изменено.

Ниже я предполагаю, что sno это идентификатор билета
Чтобы получить набор запросов:

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']
Вернуться на верх