如何使用 Django Rest Framework 过滤器将过滤器链接在一起

Posted

技术标签:

【中文标题】如何使用 Django Rest Framework 过滤器将过滤器链接在一起【英文标题】:How to chain filters together using Django Rest Framework filters 【发布时间】:2014-09-30 10:19:31 【问题描述】:

使用 Django Rest Framework 我有一个过滤器 Mixin。目前,您可以过滤当前用户或项目 ID,但不能同时过滤两者。如何将这些查询链接在一起,以便您可以过滤两者或仅其中一个?

 class FilterMixin(object):
    """
    Applies a set of filters for Lists API calls.
    """

    def get_queryset(self, *args, **kwargs):
        """
        Checks if currentuser = true is in the URL and filters this it.
        """
        currentuser = self.request.QUERY_PARAMS.get('currentuser', False)
        if currentuser == "true":
            return super(FilterMixin, self).get_queryset(*args, **kwargs).filter(user=self.request.user)

        project = self.request.QUERY_PARAMS.get('project', False)
        if project:
            return super(FilterMixin, self).get_queryset(*args, **kwargs).filter(project=project)

        return super(FilterMixin, self).get_queryset(*args, **kwargs)

我可以为每个过滤器创建一个新的 Mixin 并使用 Super() 可以工作,但我想避免这种情况。

【问题讨论】:

【参考方案1】:

来吧……

def get_queryset(self, *args, **kwargs):
    """
    Checks if currentuser = true is in the URL and filters this it.
    """
    queryset = super(FilterMixin, self).get_queryset(*args, **kwargs)

    currentuser = self.request.QUERY_PARAMS.get('currentuser')
    project = self.request.QUERY_PARAMS.get('project')

    if currentuser == "true":
        queryset = queryset.filter(user=self.request.user)

    if project:
        queryset = queryset.filter(project=project)

    return queryset

【讨论】:

以上是关于如何使用 Django Rest Framework 过滤器将过滤器链接在一起的主要内容,如果未能解决你的问题,请参考以下文章

django.test.client 上的 Django rest 框架导入错误

无法使用 Django Rest 框架发送压缩的 gzip 数据

Django 和 Django 休息框架

Django前后端分离——drf

Django REST to React - 无需密码即可获取社交身份验证令牌

尽管有 AllowAny 权限,django-rest-framework 在 POST、PUT、DELETE 上返回 403 响应