Django REST和ModelViewSet过滤

时间:2017-09-20 13:28:40

标签: python django django-rest-framework django-views

我之前使用的APIViews如下:

views.py

class AllProgramsApi(APIView):

    def get(self, request):
        user = self.request.user
        userprograms = Program.objects.filter(user=user)
        serializer = ProgramSerializer(userprograms, many=True)
        return Response(serializer.data)

这是我的模特:

class Program(models.Model):

    program_name = models.CharField(max_length=50)
    program_description = models.CharField(max_length=250)
    cycles = models.ManyToManyField(Cycle)
    is_favourite = models.BooleanField(default="False")
    user = models.ForeignKey(User, on_delete=models.CASCADE)

    def get_absolute_url(self):
        return reverse('programs:program', kwargs={'pk': self.pk})

    def __str__(self):
        return self.program_name

现在我发现了ModelViewSet,看起来非常方便,但我似乎无法像以前在APIView中那样过滤用户。

我对使用ModelViewSet的views.py的尝试如下,它可以工作,但我得到的所有内容,而不仅仅是与单个用户相关的内容。

class AllProgramsApi(ModelViewSet):
    serializer_class = ProgramSerializer
    queryset = Program.objects.all()

如何调整ModelViewSet,使其仅显示与发送请求的用户相关的内容?什么是最好的方法?

感谢。

2 个答案:

答案 0 :(得分:8)

您可以使用获取查询集方法,如果您了解更多信息,请参阅文档Filtering against the current user

class AllProgramsApi(ModelViewSet):
    serializer_class = ProgramSerializer
    queryset = Program.objects.all()
    def get_queryset(self):
        queryset = self.queryset
        query_set = queryset.filter(user=self.request.user)
        return query_set

答案 1 :(得分:1)

django中有permission_classes,您可以根据自己的要求添加权限,也可以创建自定义权限

你会从django permission

得到更好的想法

或者您可以通过定义get_queryset方法来创建查询集。