📜  我如何在 drf 的 get_queryset 函数中获取 url 值 - Python (1)

📅  最后修改于: 2023-12-03 14:54:24.244000             🧑  作者: Mango

我如何在 drf 的 get_queryset 函数中获取 url 值 - Python

在 DRF 中,get_queryset 函数用于返回一个 QuerySet 对象,用于处理请求。有时候,我们需要在 get_queryset 函数中获取 URL 的参数值,以根据参数值对查询集进行筛选或排序。

获取 URL 参数值

可以使用 request.query_params 属性来获取 URL 的参数值。例如,如果 URL 是 https://example.com/api/articles?category=python,则可以在 get_queryset 函数中使用以下代码来获取 category 参数的值:

class ArticleViewSet(viewsets.ModelViewSet):
    queryset = Article.objects.all()
    serializer_class = ArticleSerializer

    def get_queryset(self):
        category = self.request.query_params.get('category')
        if category:
            return self.queryset.filter(category=category)
        else:
            return self.queryset

在上面的示例中,self.request 包含当前请求的对象,query_params 属性包含 URL 参数的字典。可以使用 get 方法从字典中获取 category 参数的值。如果参数不存在,则返回 None

参数验证

在使用 URL 参数值时,需要注意参数的类型和格式。可以使用 Django 提供的验证器来验证 URL 参数是否符合要求。例如,如果要验证 category 参数是否是数字,则可以使用以下代码:

from django.core.exceptions import ValidationError

class ArticleViewSet(viewsets.ModelViewSet):
    queryset = Article.objects.all()
    serializer_class = ArticleSerializer

    def get_queryset(self):
        category = self.request.query_params.get('category')
        if category:
            try:
                category = int(category)
            except ValueError:
                raise ValidationError('category must be an integer')
            return self.queryset.filter(category=category)
        else:
            return self.queryset

在上面的示例中,try-except 语句用于将 category 参数转换为整数。如果无法转换,则抛出 ValidationError 异常。

结论

在 DRF 中获取 URL 参数值很简单,只需使用 request.query_params 属性即可。可以使用验证器来验证参数是否符合要求。