【问题标题】:My rest api view always creates a new object instead of put , delete and patch我的 rest api 视图总是创建一个新对象而不是 put , delete 和 patch
【发布时间】:2019-10-24 20:50:41
【问题描述】:

我正在创建一个 restapi 视图,它应该是所有 crud 的一个和所有端点。但无论我做什么,它总是执行 post 方法。终端向我显示,例如,patch 方法已被执行,但它总是确实发布并因此创建了一个新对象,它也不会删除它向我显示正确状态代码的对象,但该对象仍然存在。

这是我的看法

class StatusGET_New(

generics.ListCreateAPIView,
mixins.RetrieveModelMixin,
mixins.CreateModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin

):

queryset = Status.objects.all()
serializer_class = StatusSerializers
permission_classes = []

def perform_destroy(self, instance):
    if instance is not None:
        return instance.delete()
    return None

def get_queryset(self):
    qs = Status.objects.all()
    query = self.request.GET.get('q')
    if query is not None:
        qs = qs.filter(

            content__icontains = query

            )
    return qs   



def get_object(self):
    request = self.request
    passed_id = request.GET.get('pk',None)
    queryset = self.get_queryset()
    obj = None
    if passed_id is not None:
        obj = get_object_or_404(queryset,pk = passed_id)
        self.check_object_permissions(request,obj)
    return obj



def get(self,request,*args,**kwargs):
    passed_id = self.request.GET.get('pk',None)

    if passed_id is not None:
        return self.retrieve(request,*args,**kwargs)
    return super().get(request,*args,**kwargs)  


def post(self,request,*args,**kwargs):
    return self.create(request,*args,**kwargs)


def put(self,request,*args,**kwargs):
    url_passed_id = request.GET.get("pk",None)
    json_data = {}
    body_     = request.body
    if is_json(body_):
        json_data = json.loads(request.body)
    new_passed_id = json_data.get('pk',None)

    passed_id = url_passed_id or new_passed_id or None
    self.passed_id = passed_id
    return self.update(request,*args,**kwargs)



def patch(self,request,*args,**kwargs):
    url_passed_id = request.GET.get("pk",None)
    json_data = {}
    body_     = request.body
    if is_json(body_):
        json_data = json.loads(request.body)
    new_passed_id = json_data.get('pk',None)

    passed_id = url_passed_id or new_passed_id or None
    self.passed_id = passed_id
    return self.partial_update(body_,*args,**kwargs)




def delete(self,request,*args,**kwargs):
    url_passed_id = request.GET.get("pk",None)
    json_data = {}
    body_     = request.body
    if is_json(body_):
        json_data = json.loads(request.body)
    new_passed_id = json_data.get('pk',None)

    passed_id = url_passed_id or new_passed_id or None
    self.passed_id = passed_id
    return self.destroy(request,*args,**kwargs)

【问题讨论】:

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


    【解决方案1】:

    您正在混淆 ListCreateAPIView 和 mixins。您应该将 GenericAPIView 与 mixins 一起使用,并且通常 mixins 在继承顺序中应该排在 GenericAPIView 之前。

    class StatusGET_New(
        generics.GenericAPIView,
        mixins.RetrieveModelMixin,
        mixins.CreateModelMixin,
        mixins.UpdateModelMixin,
        mixins.DestroyModelMixin):
    ...
    

    但是从您的代码来看,您似乎希望详细路由和列表路由都由同一个视图处理,因此您需要的是视图集。所以应该是这样的:

    from restframework.viewsets import ModelViewSet
    
    class StatusGET_New(ModelViewSet):
        ...
    

    模型视图已经实现了所有这些方法,因此您可能需要检查代码并尽可能使用默认实现。

    就像评论一样,你真的可以改进你的视图命名——比如StatusViewStatusViewSet

    【讨论】:

    • 谢谢,但问题不是这个,而是别的!
    • 你的代码无论如何都行不通。您正在使用通用视图并以错误的方式混合
    • 是的,但主要问题仍然是别的。
    猜你喜欢
    • 2018-03-17
    • 2019-07-18
    • 1970-01-01
    • 1970-01-01
    • 2014-08-06
    • 1970-01-01
    • 2019-09-20
    • 1970-01-01
    • 2015-07-26
    相关资源
    最近更新 更多