как обновить всю запись сразу в Django

#python #django

Вопрос:

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

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 %}
 

Ответ №1:

Вам нужно изменить 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)
 

Комментарии:

1. действительно ценю быстрый ответ, который я попробовал в вашем коде, он возвращает объект ‘function’, у которого нет атрибута ‘update’

Ответ №2:

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

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

Ответ №3:

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')
   i = 0
   for department in departments:
      setattr(department, 'BUID', value1[i])
      setattr(department, 'GBUID', value2[i])
      department.save()
      i  

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

 

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

Комментарии:

1. спасибо за повтор, но, к сожалению, он обновил всю запись с помощью [‘123’], которая является первым полем, которое я ввел

2. Примечание: я не хочу обновлять всю запись одним и тем же вводом, я просто хочу перебирать входные данные внутри цикла for в шаблоне и обновлять BUID, GBUID со ссылкой на DepartmentID

3. О, я думал, что вы хотите обновить его для всех. Затем, если у вас есть данные в списке, вы можете просто for loop выбросить их.