简体   繁体   English

Django REST 和 ModelViewSet 过滤

[英]Django REST and ModelViewSet filtering

I was previously using APIViews such as the following:我以前使用 APIViews,如下所示:

views.py视图.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)

here's my model:这是我的 model:

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

Now I've discovered ModelViewSet, which looks very convenient, but I can't seem to be able to filter for the user as I was previously doing in the APIView.现在我发现了ModelViewSet,它看起来很方便,但是我似乎无法像之前在APIView 中那样为用户进行过滤。

my attempt at views.py with ModelViewSet is the following and it works but I get all the content and not just the content related to a single user.我对带有 ModelViewSet 的 views.py 的尝试如下,它有效,但我得到了所有内容,而不仅仅是与单个用户相关的内容。

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

How can I tweak the ModelViewSet so that it displays only the content related to the user who sends the request?如何调整 ModelViewSet 使其仅显示与发送请求的用户相关的内容? What is the best method?最好的方法是什么?

Thanks.谢谢。

You can use get queryset method,if you know more refer the doc Filtering against the current user 您可以使用get queryset方法,如果您了解更多,请参阅针对当前用户的doc Filtering

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

there are permission_classes in django you can add permissions as per your requirements or you can create custom permissions django中有permission_classes,您可以根据自己的要求添加权限,也可以创建自定义权限

you would get better idea from django permission 你会从django许可得到更好的主意

or you can create your queryset by defining get_queryset method. 或者您可以通过定义get_queryset方法来创建查询集。

I have a question and if I wanted to filter it by a field, in this case if I wanted to filter it by program_name?我有一个问题,如果我想按字段过滤它,在这种情况下,如果我想按 program_name 过滤它?

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM