Объект 'int' не имеет атрибута 'save', в то время как я пытаюсь обновить несколько строк

Я пытаюсь обновить несколько строк в зависимости от нескольких данных. Но при отправке обновляется только один ряд, и я получаю эту ошибку Объект 'int' не имеет атрибута 'save'. Я думаю, что проблема в моем представлении. Мое представление приведено ниже:

def saleForm(request):
   stb = []
   if request.method == 'POST':
   for stb_array in request.POST.getlist('stb_sl'):
      stb.append(stb_array)
      i = 0
   for stb_ho in stb:
      stb_update = StpDetails.objects.filter(stp_sl=stb_ho).update(
        sale_date=date,
        sales_invoice=invoice,
        status='Sold')
      stb_update.save()
      i += 1
   messages.success(request, 'You have successfully save data.')
   return render(request,'sale/invoice_details.html',{})

Моя модель:

  class StpDetails(models.Model):
     id = models.AutoField(primary_key=True)
     entry_date = models.DateField(default=date.today)
     stp_sl = models.CharField(max_length=50, unique=True)
     stp_name = models.CharField(max_length=30)
     sale_date = models.DateField(auto_now=False, null=True)
     sales_invoice = models.CharField(max_length=20, blank=True)
     install_date = models.DateField(auto_now=False, null=True)
     installer = models.CharField(max_length=50, blank=True)
     house = models.CharField(max_length=100, blank=True)
     status = models.CharField(max_length=7, default='Unsold')

          def __str__(self):
             return self.stp_sl

В документации на метод QuerySet.update() показано, что этот метод уже сохраняет изменения, поэтому нет необходимости использовать .save() после этого.

Кроме того, этот метод возвращает НЕ экземпляр модели, а целое число; именно поэтому вы получаете ошибку, потому что stb_update является целым числом и не имеет метода под названием .save().

update() [...] и возвращает количество совпавших строк (которое может быть не равно количеству обновленных строк, если некоторые строки уже имеют новое значение).

Таким образом, ваш код может выглядеть следующим образом:

def saleForm(request):
    if request.method == 'POST':
        date = ...
        invoice = ...

        stb = []
        for stb_array in request.POST.getlist('stb_sl'):
            stb.append(stb_array)

        i = 0
        for stb_ho in stb:
            stb_update = StpDetails.objects.filter(stp_sl=stb_ho).update(
                sale_date=date,
                sales_invoice=invoice,
                status='Sold')
            i += 1

        messages.success(request, 'You have successfully save data.')
    else:
        # a GET request
        pass

    return render(request, 'sale/invoice_details.html', {})
Вернуться на верх