我正试图使用怀疑类视图列出所有的怀疑类模型,但在发布请求中出现了一些递归错误,我无法理解,我搜索了相同的错误,并尝试过是否犯了与其他提出相同问题的开发人员类似的错误,但就我搜索到的问题而言,其中一个是不同的
我的怀疑类视图
class DoubtClass(LoginRequiredMixin, mixins.ListModelMixin, mixins.CreateModelMixin, generics.GenericAPIView):
serializer_class = serializers.DoubtClass_serializer
queryset = models.DoubtClasses.objects.filter(is_draft=False)
def get(self, request):
print("error in doubtclass get")
return self.list(request)
def post(self, request):
if request.user.is_superuser:
return self.post(request)
else:
return Response(status=status.HTTP_403_FORBIDDEN)
我的怀疑类模型
class DoubtClasses(models.Model):
doubtClass_details = models.TextField()
class_time = models.DateTimeField()
end_time = models.DateTimeField()
doubtsAddressed = models.IntegerField(default=0)
no_of_students_registered = models.IntegerField(default=0)
no_of_students_attended = models.IntegerField(default=0)
mentor_id = models.ForeignKey(Mentor, on_delete=models.CASCADE, null=True)
is_draft = models.BooleanField(default=True)
class Meta:
verbose_name_plural = 'DoubtClasses'
def __str__(self):
return self.doubtClass_details
我是django 的新手
从您的代码中,您似乎希望将post
请求限制为超级用户。实现的问题在于,您只是递归地再次调用post
。鉴于您从CreateModelMixin
继承,您可能希望改为调用create
:
class DoubtClass(LoginRequiredMixin, mixins.ListModelMixin, mixins.CreateModelMixin, generics.GenericAPIView):
serializer_class = serializers.DoubtClass_serializer
queryset = models.DoubtClasses.objects.filter(is_draft=False)
def get(self, request, *args, **kwargs):
print("error in doubtclass get")
return self.list(request)
def post(self, request, *args, **kwargs):
if request.user.is_superuser:
return self.create(request, *args, **kwargs) # call `create` instead
else:
return Response(status=status.HTTP_403_FORBIDDEN)
但这是可以改进的。首先,您可以简单地将其简化为从generics.ListCreateAPIView
继承,而不是从ListModelMixin
、CreateModelMixin
和GenericAPIView
继承。接下来,与其使用LoginRequiredMixin
,不如使用IsAuthenticated
权限。此外,您对POST请求的限制仅限于也可以添加到自定义权限的超级用户:
from rest_framework.permissions import BasePermission, IsAuthenticated, SAFE_METHODS
class IsSuperuserOrReadOnly(BasePermission):
def has_permission(self, request, view):
return bool(
request.method in SAFE_METHODS or
request.user and
request.user.is_superuser
)
class DoubtClass(generics.ListCreateAPIView):
serializer_class = serializers.DoubtClass_serializer
queryset = models.DoubtClasses.objects.filter(is_draft=False)
permission_classes = [IsAuthenticated, IsSuperuserOrReadOnly]