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

Is there a way to use inheritance in django viewsets or do I have to rewrite the functions?

我正在 Django Rest Framework 中编写 API。我正在使用视图集,但是常规方法 create() 和 update() 不适合我,我必须重写它们。

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

目前我有这个:

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

是的,它确实有效,而且你几乎正确地做到了......根据你的错误:当你在第一个参数,将该调用更改为:

super().create(request, *args, **kwargs)

Python standard docs 有一些关于 super() 的信息和 link 更深入的解释。