Объект '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', {})