有没有办法在 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 更深入的解释。
我正在 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 更深入的解释。