Мой вид api отдыха всегда создает новый объект вместо put, delete и patch - PullRequest
0 голосов
/ 10 июня 2019

Я создаю представление restpi, которое должно быть единственной конечной точкой для всех 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)

1 Ответ

0 голосов
/ 10 июня 2019

Вы смешиваете ListCreateAPIView и mixins.Вместо этого вы должны использовать GenericAPIView вместе с миксинами, и обычно миксины должны стоять первыми в порядке наследования перед GenericAPIView.

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

Но из вашего кода вы, похоже, хотите иметь как подробный маршрут, так и маршрутный списокобрабатывается одним и тем же представлением, так что вам нужен набор.Таким образом, это должно быть так:

from restframework.viewsets import ModelViewSet

class StatusGET_New(ModelViewSet):
    ...

Представление модели уже имеет реализацию для всех этих методов, поэтому вы можете захотеть проверить код и использовать реализацию по умолчанию, где это возможно.

И просто в качестве комментария вы могли бы действительно улучшить свое представление имен - что-то вроде StatusView или StatusViewSet

...