Django Rest框架过滤ModelViewSet字段对多重值

时间:2017-06-23 11:12:09

标签: python django django-rest-framework

我的DRF API存在问题。

我想根据ID列表过滤问题列表。像这样:

127.0.0.1:8000/api/issues/?id=2,12

这将返回整个问题列表

我也试过

http://127.0.0.1:8000/api/issues/?id=2&id=12

这将返回一个列表,其中仅包含具有最后提供的id的对象(ID为12的对象

我还尝试了以下所有内容,它们都返回整个集合

http://127.0.0.1:8000/api/issues/?id__in=2&id__in=12
http://127.0.0.1:8000/api/issues/?id__in=2,12

这是我的序列化工具

from rest_framework import serializers
...
class IssueSerializer(serializers.HyperlinkedModelSerializer):
    '''Serializer for issues'''
    class Meta:
        '''Model filed definitions'''
        model = Issue
        fields = ('id', 'inspection_sheet', 'picture', 'description', 'resolution')

视图

from rest_framework import filters
from rest_framework import viewset
...
class IssueSet(viewsets.ModelViewSet):
    '''Views for issues'''
    queryset = Issue.objects.all()
    serializer_class = IssueSerializer
    filter_backends = (filters.DjangoFilterBackend,)
    filter_fields = ('id',)

1 个答案:

答案 0 :(得分:0)

要实现此目的,您必须使用Filterset

创建BaseInFilter
class NumberInFilter(BaseInFilter, NumberFilter):
    pass

class IssueFilter(FilterSet):
   id = NumberInFilter(name='id', lookup_expr='in')
   class Meta:
       fields = ['id']
       model = Issue

class IssueSet(viewsets.ModelViewSet):
    '''Views for issues'''
    queryset = Issue.objects.all()
    serializer_class = IssueSerializer
    filter_backends = (filters.DjangoFilterBackend,)
    filter_class = IssueFilter

然后您应该可以使用:

http://127.0.0.1:8000/api/issues/?id=2&id=12