在django中发出post请求时,在django中调用Python对象时出错,超过了最大递归深度



我正试图使用怀疑类视图列出所有的怀疑类模型,但在发布请求中出现了一些递归错误,我无法理解,我搜索了相同的错误,并尝试过是否犯了与其他提出相同问题的开发人员类似的错误,但就我搜索到的问题而言,其中一个是不同的

我的怀疑类视图

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继承,而不是从ListModelMixinCreateModelMixinGenericAPIView继承。接下来,与其使用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]

相关内容

最新更新