Как обновить все записи одновременно в 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)
Также я добавил типы, чтобы вы лучше понимали, что происходит