Как обновить все записи одновременно в Djnago

Я хочу отобразить все созданные отделы в одном представлении с помощью цикла for и обновить все записи сразу. проблема в том, что он берет только первую запись и обновляет все записи значением, введенным в первом поле. я пробовал использовать .getlist() но все равно берется только первая запись. как обновить каждую запись со ссылкой на ее id и если поле пустое сохранить эту запись нетронутой.

Views.py

def department(request):
departments = Department.objects.all()
value1 = request.POST.getlist('BUID')
value2 = request.POST.getlist('GBUID')
print(value1)
print(value2)
Department.objects.update(
    BUID=request.POST.get('BUID'),
    GBUID=request.POST.get('GBUID'),
)
context = {'departments': departments}
return render(request, 'employee/department.html', context)

models.py

class Department(models.Model):
DepartmentID = models.IntegerField()        <------will be Entered by the admin
Name = models.CharField(max_length=200)     <------will be Entered by the admin
BUID = models.CharField(max_length=200, blank=True)    <------to be updated in the view
GBUID = models.CharField(max_length=200, blank=True)   <------to be updated in the view

шаблоны

<form action="" method="POST">
{% csrf_token %}
    <h3>Manage Departments</h3>
    <input class="btn btn-primary" type="submit" value="Submit">

{% for department in departments %}
<div class="col-sm-6">
    <label>Department ID: {{department.DepartmentID}}</label>
</div>
<div class="col-sm-6">
    <label>Department Name: {{department.Name}}</label>
</div>

<label>BU/Department Manager Id:</label>
<div class="col-sm-3">
    <input name="BUID" class="form-control">
</div>

<label>GBU/Group Department Manager Id:</label>
<div class="col-sm-3">
    <input name="GBUID" class="form-control">
</div>

</form>
{% endfor %}

Вам необходимо изменить файл views.py :-

views.py

def department(request):
   departments = Department.objects.all()
   value1 = request.POST.getlist('BUID')
   value2 = request.POST.getlist('GBUID')
   print(value1)
   print(value2)
   Department.objects.all.update(
       BUID=value1,
       GBUID=value2
   )
   context = {'departments': departments}
   return render(request, 'employee/department.html', context)

если вы хотите обновить много строк одновременно, вам нужно использовать следующее https://docs.djangoproject.com/en/3.2/ref/models/querysets/#bulk-update

Примечание: массовое обновление будет игнорировать сигналы, поднятые во время сохранения объекта

views.py:

from django.http.request import HttpRequest
from django.db.models.query import QuerySet

def department(request: HttpRequest):
   departments: QuerySet[Department] = Department.objects.all()
   value1 = request.POST.getlist('BUID')
   value2 = request.POST.getlist('GBUID')

   for department in departments:
      setattr(department, 'BUID', value1)
      setattr(department, 'GBUID', value2)
      department.save()

   context = {'departments': departments}
   return render(request, 'employee/department.html', context)

Также я добавил типы, чтобы вы лучше понимали, что происходит

Вернуться на верх