无法找到实现Django筛选器的正确方法

无法找到实现Django筛选器的正确方法,django,django-rest-framework,django-filter,Django,Django Rest Framework,Django Filter,我的问题是我必须为某些字段的用户查询数据库,这些字段是des,gender,min\u age,max\u age。当我使用多个值时,它使用filter\u queryset工作正常。然后我对gender使用了多个值,但是当我在url中没有包含gender时,代码基本上会中断,因为split不起作用。 所以我想使用多个if/else,它们将有不同的queryset.filter(des_uin=[],gender_uin=[])或gender不可用,然后查询->queryset.filter(d

我的问题是我必须为某些字段的用户查询数据库,这些字段是
des
gender
min\u age
max\u age
。当我使用多个值时,它使用
filter\u queryset
工作正常。然后我对
gender
使用了多个值,但是当我在url中没有包含
gender
时,代码基本上会中断,因为
split
不起作用。 所以我想使用多个
if/else
,它们将有不同的
queryset.filter(des_uin=[],gender_uin=[])
gender
不可用,然后查询->
queryset.filter(des_uin=[])
。我在这里错过了很多东西。请帮忙

API-
/v1/users/query\u users?des=1,2&性别=男性、女性&最小年龄=2&最大年龄=4

class ProductFilter(django_filters.rest_framework.FilterSet):
    min_age = django_filters.DateRangeFilter(name="dob", lookup_expr="gte")
    max_age = django_filters.DateRangeFilter(name="dob", lookup_expr="lte")
    class Meta:
        model = UserProfile
        fields = ['des', 'gender', 'min_age', 'max_age']


class QueryUserGroup(generics.ListAPIView):
    queryset = UserProfile.objects.all()
    serializer_class = UserProfileSerializer
    filter_backends = (django_filters.rest_framework.DjangoFilterBackend,)
    filter_class = ProductFilter
    permission_classes = [permissions.IsAuthenticatedOrReadOnly]

    def filter_queryset(self, queryset):
        des_list = self.request.GET.getlist("des")
        gender_list = self.request.GET.getlist("gender")
        des_ids = des_list[0].split(',')
        gender_ids = gender_list[0].split(',')
        return queryset.filter(des__in=des_ids, gender__in=gender_ids)

    def list(self, request, *args, **kwargs):
        queryset = self.filter_queryset(self.get_queryset())
        serializer = UserProfileSerializer(queryset, many=True)
        return JSONResponse({'data': serializer.data}, status=HTTP_200_OK)

您应该重新排列代码,以便仅在字段位于querystring中时拆分字符串并过滤queryset

由于您只访问列表中的第一项,因此最好使用
get
而不是
getlist

def filter_queryset(self, queryset):
    des = self.request.GET.get("des")
    if des is not None:
        des_ids = des.split(',')
        queryset = queryset.filter(des__in=des_ids)

    gender = self.request.GET.get("gender")
    if gender is not None:
        gender_ids = gender.split(',')
        queryset = queryset.filter(gender__in=gender_ids)

    return queryset
如果有两个以上的字段,可以通过循环浏览字段名列表来减少重复代码:

def filter_queryset(self, queryset):
    for fieldname in ("des", "gender"):
        value = self.request.GET.get(fieldname)
        if value is not None:
            ids = value.split(',')
            queryset = queryset.filter(**{'%s__in' % fieldname: ids})

    return queryset