【问题标题】:General way of filtering by IDs with DRF使用 DRF 按 ID 过滤的一般方法
【发布时间】:2016-08-19 11:23:39
【问题描述】:

在使用 DRF 时,是否有一种通用的方法可以按 ID 数组进行过滤? 例如,如果我想返回所有具有以下 ID 的图像,我会这样做:

/images/?ids=1,2,3,4

我目前的实现是执行以下操作:

# filter
class ProjectImageFilter(django_filters.FilterSet):
    """
    Filter on existing fields, or defined query_params with
    associated functions
    """
    ids = django_filters.MethodFilter(action='id_list')

    def id_list(self, queryset, value):
        """
        Filter by IDs by passing in a query param of this structure
            `?ids=265,263`
        """
        id_list = value.split(',')
        return queryset.filter(id__in=id_list)

    class Meta:
        model = ProjectImage
        fields = ['ids',]


# viewset
class Images(viewsets.ModelViewSet):
    """
    Images associated with a project
    """
    serializer_class = ImageSerializer
    queryset = ProjectImage.objects.all()
    filter_class = ProjectImageFilter

但是,在这种情况下,ProjectImageFilter 需要指定模型 (ProjectImage)。有没有一种方法可以让我通常定义这个过滤器,以便我可以在具有不同模型的多个 ViewSet 上使用它?

【问题讨论】:

  • 不是一个解决方案,但是出于同样的原因,我在模型中添加了其他字段来存储文件名甚至文件关键字。这样我就可以轻松地按名称和关键字搜索我的文件。

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


【解决方案1】:

没有django-filters 的一种解决方案是只使用super() 覆盖get_queryset。这是一个例子:

class MyViewSet(view.ViewSet):

    # your code

    def get_queryset(self):
        queryset = super(MyViewSet, self).get_queryset()

        ids = self.request.query_params.get('ids', None)
        if ids:
            ids_list = ids.split(',')
            queryset = queryset.filter(id__in=ids_list)

        return queryset

【讨论】:

    猜你喜欢
    • 2021-10-20
    • 2019-05-31
    • 1970-01-01
    • 2023-03-13
    • 2020-05-25
    • 1970-01-01
    • 1970-01-01
    • 2020-01-14
    • 2021-12-31
    相关资源
    最近更新 更多