【问题标题】:django api using generic views for deleting multiple objectsdjango api 使用通用视图删除多个对象
【发布时间】:2021-05-18 02:59:52
【问题描述】:

我正在尝试使用 django 通用视图。我希望能够使用相同的视图同时删除多个对象。例如删除我模型中的所有“femail”员工。 我使用了以下代码:

from ..models import Employee
from . import serializer
from rest_framework import generics, status
from rest_framework.response import Response
from django.shortcuts import get_list_or_404, get_object_or_404

class EmployeeDeleteandUpdate(generics.UpdateAPIView):
    queryset = Employee.objects.filter(gender__startswith='femail')
    serializer_class = serializer.PostSerializer

    def delete(self, request, *args, **kwargs):
        myobj = get_object_or_404(Employee, gender=kwargs['gender'])
        myobj.delete()
        return Response("Femails deleted", status=status.HTTP_204_NO_CONTENT)

这是我的网址代码:

path('mydel/<str:gender>/', view.EmployeeDeleteandUpdate.as_view()),

还有我的模特:

class Employee(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)
    gender = models.CharField(max_length=10)
    national_code = models.CharField(max_length=11)
    personal_code = models.CharField(max_length=15)
    phone_number = models.CharField(max_length=11)
    address = models.CharField(max_length=50)
    married = models.BooleanField()
    age = models.IntegerField()
    wage = models.IntegerField()

     def __str__(self):
         return self.first_name

但是当我在我的 django rest 框架中使用带有以下 url 的删除方法时:

http://127.0.0.1:8000/mydel/femail/

我收到此错误:

client.models.Employee.MultipleObjectsReturned: get() 返回更多 超过 1 个 Employee - 它返回 2 个!

有人可以帮我解决这个问题吗?

【问题讨论】:

    标签: django api django-models django-rest-framework


    【解决方案1】:

    get_object_or_404 方法仅从表中获取 1 个对象,因此记录在表中必须是唯一的。否则会报错。

    请试试这个代码:

      def delete(self, request, *args, **kwargs):
            employees = Employee.objects.filter(gender=kwargs['gender'])
            if employees.count() > 0:
               employees.delete()
               return Response("Femails deleted", status=status.HTTP_204_NO_CONTENT)
            return Response("Unable to find the femails.", status=status.HTTP_404_OK)
    

    在这段代码 sn-p 中,我根据 kwargs['gender'] 过滤结果,然后计算其对象(如果大于 1)然后使用循环将其删除。

    【讨论】:

    • 非常感谢。这个解决方案有效:)
    猜你喜欢
    • 2013-11-14
    • 1970-01-01
    • 2020-02-13
    • 2019-01-05
    • 2012-02-26
    • 1970-01-01
    • 2018-10-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多