Django rest framework 有没有办法在django视图集中使用继承,或者我必须重写函数?

Django rest framework 有没有办法在django视图集中使用继承,或者我必须重写函数?,django-rest-framework,django-rest-viewsets,Django Rest Framework,Django Rest Viewsets,我正在Django Rest框架中编写一个API。我使用的是viewset,但是常规的create()和update()方法不适合我,我必须重写它们 假设我只需要做一次检查来测试实例的创建是否合法,我还需要重写整个create函数吗 目前我有: class LocationViewSet(viewsets.ModelViewSet): permission_classes = (IsAuthenticated,) serializer_class = LocationSeria

我正在Django Rest框架中编写一个API。我使用的是viewset,但是常规的create()和update()方法不适合我,我必须重写它们

假设我只需要做一次检查来测试实例的创建是否合法,我还需要重写整个create函数吗

目前我有:

class LocationViewSet(viewsets.ModelViewSet):
    permission_classes = (IsAuthenticated,)

    serializer_class = LocationSerializer        
    def create(self, request, *args, **kwargs):

            user = request.user

            serializer = self.get_serializer(data=request.data)
            serializer.is_valid(raise_exception=True)

            if user.can_create_location():
                serializer.save()
                return Response(serializer.data)
            else:
                raise exceptions.PermissionDenied('You dont have permission to create this.')
与其重写整个过程,是否有可能以某种方式使用继承并执行类似的操作

class LocationViewSet(viewsets.ModelViewSet):
    permission_classes = (IsAuthenticated,)

    serializer_class = LocationSerializer        
    def create(self, request, *args, **kwargs):

            user = request.user
            if user.can_create_location():
                return super().create(self, request, *args, **kwargs)
            else:
                raise exceptions.PermissionDenied('You dont have permission to create this.')
当我得到这个错误时,上面的方法不起作用。我觉得这应该是可能的,但我不知道怎么做。谢谢你的帮助

AttributeError at /api/0/location
LocationViewSet' object has no attribute 'data'

Request Method: POST
Request URL: http://127.0.0.1:8000/api/0/location
Django Version: 2.1.7

是的,它确实有效,而且你做得几乎正确。。。根据您的错误:函数正在尝试访问
LocationViewSet.data
当您在第一个参数中传递
self
时,将该调用更改为:

super().create(请求、*args、**kwargs)


有一些关于
super()
的信息,还有一个指向更深入解释的链接。

是的,它确实有效,而且你做得几乎正确。。。根据您的错误:函数正在尝试访问
LocationViewSet.data
当您在第一个参数中传递
self
时,将该调用更改为:

super().create(请求、*args、**kwargs)


有一些关于
super()
的信息,还有一个指向更深入解释的链接。

谢谢!这管用!不给create方法提供另一个自参数是有意义的。不知道我怎么没发现这个。谢谢!这管用!不给create方法提供另一个自参数是有意义的。不知道我怎么没发现这个。