Django Rest Framework针对Multipe值过滤ModelViewSet字段 [英] Django Rest Framework Filter ModelViewSet Field Against Multipe Values

查看:169
本文介绍了Django Rest Framework针对Multipe值过滤ModelViewSet字段的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的DRF API有问题。

I have an issue with my DRF API.

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

I would like to filter a list of issues against a list of ids. Like so:

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的对象

This returns a list containing only the object with the last supplied id (the object with id 12

我还尝试了以下方法,它们全部返回了整个集合

I've also tried the following which all return the entire set

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',)


推荐答案

要实现此目的,您必须创建过滤器集,使用 BaseInFilter

To achieve this you will have to create a Filterset using a 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

这篇关于Django Rest Framework针对Multipe值过滤ModelViewSet字段的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆