Django Как выполнить массовое обновление всех дочерних объектов?
Я создаю систему справочной службы на django. Где любой может открыть тикет для поддержки клиента.
Предположим, у меня есть родительский объект #001 и все дочерние объекты этого родителя имеют одинаковый id тикета. Для лучшего понимания смотрите скриншот:
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']