如何在DRF(Django Rest Framework)generic.ListView中验证url变量?

时间:2019-05-17 16:49:57

标签: python django django-rest-framework

我想在DRF generic.ListView中为我的查询集使用url变量, 但是我现在仍然可以验证这一点,我想知道如何验证

我编写了以下代码,但不起作用。

class VideoView(generics.ListAPIView):
    def validate(self):
        print("ejra")
        if "class" not in self.request.GET:
            return Response({"error": "class should exist"}, status=status.HTTP_400_BAD_REQUEST)
        if len(Class.objects.filter(pk=self.request.GET["class"])) < 1:
            return Response({"error": "class not found"}, status=status.HTTP_400_BAD_REQUEST)

    def get_queryset(self):
        self.validate()
        class_obj = Class.objects.get(pk=self.request.GET["class"])
        queryset = Video.objects.filter(study_class=class_obj).order_by("-date")
        return queryset

    serializer_class = VideoSerializer

1 个答案:

答案 0 :(得分:2)

您可以通过 DRF API ValidationError 方法本身来提高 validate()

from rest_framework.exceptions import ValidationError


class VideoView(generics.ListAPIView):
    serializer_class = VideoSerializer

    def validate(self):
        if "class" not in self.request.GET:
            raise ValidationError({"error": "class should exist"})
        if Class.objects.filter(pk=self.request.GET["class"]).exists():
            raise ValidationError({"error": "class not found"})

    def get_queryset(self):
        self.validate()
        class_obj = Class.objects.get(pk=self.request.GET["class"])
        queryset = Video.objects.filter(study_class=class_obj).order_by("-date")
        return queryset

注释

  1. 使用DRF ValidationError()异常引发错误
  2. 使用Django Queryset's exists()方法检查是否存在任何对象。
  3. 从不使用 len() 函数检查Django查询集的 count() ,这是非常非常糟糕的做法。