【问题标题】:Django REST and ModelViewSet filteringDjango REST 和 ModelViewSet 过滤
【发布时间】:2018-03-01 14:17:15
【问题描述】:

我之前使用过如下 APIView:

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 使其仅显示与发送请求的用户相关的内容?最好的方法是什么?

谢谢。

【问题讨论】:

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


    【解决方案1】:

    django 中有权限类,您可以根据需要添加权限,也可以创建自定义权限

    你会从django permission得到更好的主意

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

    【讨论】:

      【解决方案2】:

      你可以使用get queryset方法,如果你知道更多参考文档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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-16
        • 2014-08-24
        • 1970-01-01
        • 1970-01-01
        • 2016-11-21
        • 1970-01-01
        相关资源
        最近更新 更多