AttributeError: объект 'QuerySet' не имеет атрибута 'save'

Вот страница, которую я пытаюсь разработать. При нажатии на кнопку обновления, заполненные данные должны обновляться в базе данных MySql под названием TL.

enter image description here

Но при нажатии на кнопку update выдает следующую ошибку: AttributeError at /add/ Объект 'QuerySet' не имеет атрибута 'save'

enter image description here

Ниже приведен файл Views.py в Django, в котором я разместил код для добавления:

    def add(request):
    ad = TL.objects.all()
    if request.method == 'POST':
        TL_Name = request.POST.get('TL_Name')
        Proj_name = request.POST.get('Proj_name')
        Deadline = request.POST.get('Deadline')
        ad.TL_Name = TL_Name
        ad.Proj_name = Proj_name
        ad.Deadline = Deadline
        ad.save()
        return redirect("/operations")
    return render(request, 'operations.html', {"name": ad, 'b': ad})

Ниже представлен файл urls.py:

from . import views

urlpatterns = [
    path('', views.home),
    path('adminlogin/', views.adminlogin),
    path('operations/', views.operations),
    path('approve/<int:pk>', views.approval),
    path('decline/<int:pk>/', views.delete),
    path('edit/<int:pk>/', views.edit),
    path('add/', views.add),
    path('tlist/', views.approved_tlist)
]

Ниже представлен файл operations.html:

Пожалуйста, помогите мне разобраться с этой ошибкой. Заранее благодарю...

    ad = TL.objects.all() 

это присвоение кверисета всех TL к ad

    ad.TL_Name = TL_Name
    ad.Proj_name = Proj_name
    ad.Deadline = Deadline
    ad.save()

поэтому не может быть сделано, так как это не один элемент.

Если вы хотите обновить все объекты TL, вы можете использовать update

   ad = TL.objects.update(TL_Name=TL_Name, Proj_name=Proj_name, Deadline=Deadline)

или используйте TL.objects.first() или TL.objects.get(id=id_you_want)

для получения отдельного экземпляра модели, а затем используйте

    ad.TL_Name = TL_Name
    ad.Proj_name = Proj_name
    ad.Deadline = Deadline
    ad.save()

Сначала вы устанавливаете ad = TL.objects.all() Это возвращает все ваши объекты Model. Затем далее в своем коде вы пытаетесь сохранить ad в базу данных. Это не сработает, и Django говорит вам об этом. Вы пытаетесь сохранить набор запросов.

У вас возникла эта ошибка, потому что вы применяете метод .save() на кверисете, что неправильно. Вместо этого вам нужно вызвать .save() на экземпляре объекта вот так:

def add(request):
    # ad = TL.objects.all()  Not usefull here
    context = {}
    
    if request.method == 'POST':
        TL_Name = request.POST.get('TL_Name')
        Proj_name = request.POST.get('Proj_name')
        Deadline = request.POST.get('Deadline')
        
        # Create a new TL instance here (Note that with class.objects.create() we don't need to call save())
        new_tl = TL.objects.create(TL_Name=TL_Name, Proj_name=Proj_name, Deadline=Deadline)
        # Update the context data
        context = ['b'] = new_tl
        
        return redirect("/operations")
    # Retrieve all TL objects and add to context
    context['name'] = TL.objects.all()

    return render(request, 'operations.html', context)
Вернуться на верх