Django: сделайте дополнение внутри model.objects.filter.update()

#python #django

#python #django

Вопрос:

У меня есть это представление, которое имеет форму, и я хочу обновить поле модели на основе пользовательского ввода. Я не могу найти способ сделать это. Похоже, что способ = pythonic в этой ситуации не работает.

Вот мое мнение:

 def orders_on_the_way_edit2(request, Id):
   
    OnOrder2 = get_object_or_404(table_on_order, Id=Id)
    if request.method == 'POST':
        form = OnOrderUpdateForm(request.POST, instance = OnOrder2)
        if form.is_valid():
            
            form.save()
            
        quantity = form.cleaned_data.get('Quantity_received')
        id = form.cleaned_data.get('Id')
        update2 = table_on_order.objects.filter(Id = Id).update(Quantity_received =  quantity)
        update = table_on_order.objects.filter(Id = Id).update(StockOnOrder = (StockOnOrder - quantity))
        messages.success(request, "Changed in order status successfully recorded")
        return redirect('OnOrder2')
    else:
        form = OnOrderUpdateForm(initial = {
            'Id' : OnOrder2.Id,
            'StockOnOrder' : OnOrder2.StockOnOrder,
            'Quantity_received' : OnOrder2.Quantity_received,
            'OrderCompleted' : OnOrder2.OrderCompleted}, instance =OnOrder2)
                                 
        return render(request, 'OnOrder2edit.html', {'form' : form}) 
  

строки:

 update2 = table_on_order.objects.filter(Id = Id).update(Quantity_received =  quantity)
        update = table_on_order.objects.filter(Id = Id).update(StockOnOrder = (StockOnOrder - quantity))
  

вызывает проблему, update1 заменяет существующее значение на quantity и update2 выдает ошибку.

Любая подсказка по этому поводу будет оценена!

Ответ №1:

Похоже, что способ = pythonic в этой ситуации не работает.

Нет, поскольку это, в конце концов, вызов функции. Django не может изменить язык Python. Но у него есть некоторые объекты и т. Д. Для внесения обновлений в поля.

Как объясняется в документации по .update(…) [Django-doc], вы можете использовать F -object [Django-doc] для ссылки на поле, поэтому:

 from django.db.models import F

update2 = table_on_order.objects.filter(Id=Id).update(
    Quantity_received=F('Quantity_received')   quantity
)
table_on_order.objects.filter(Id=Id).update(
    StockOnOrder=F('StockOnOrder') - quantity
)  

Вы можете объединить два запроса здесь и, таким образом, обновить оба поля с помощью:

 from django.db.models import F

update = table_on_order.objects.filter(Id=Id).update(
    Quantity_received=F('Quantity_received')   quantity,
    StockOnOrder=F('StockOnOrder') - quantity
)  

комбинируя два, мы, таким образом, совершаем один обратный переход к базе данных вместо двух.