Django rest framework 如何基于传递的过滤器编写动态django orm查询集?

Django rest framework 如何基于传递的过滤器编写动态django orm查询集?,django-rest-framework,django-queryset,Django Rest Framework,Django Queryset,我需要根据前端作为json传递的过滤器,在queryset上动态应用过滤器 例如 如果传递的json为:{id:[1,2,3]} 然后查询集将是:Model.objects.filter(id\uu in=id) 如果json被传递为:{id:[1,2,3],则国家:['india','australia']} 然后查询集将是:Model.objects.filter(id\uu in=id,country\uu in=country) 如何动态实现这一点?您可以使用if/else语句来检测国家

我需要根据前端作为json传递的过滤器,在queryset上动态应用过滤器

例如

如果传递的json为:{id:[1,2,3]} 然后查询集将是:Model.objects.filter(id\uu in=id)

如果json被传递为:{id:[1,2,3],则国家:['india','australia']}

然后查询集将是:Model.objects.filter(id\uu in=id,country\uu in=country)


如何动态实现这一点?

您可以使用if/else语句来检测国家/地区列表是否为空:

if not country:
     Model.objects.filter(id__in=id)
else:
     Model.objects.filter(id__in=id, country__in=country)
编辑:

有评论指出,过滤器的数量是动态的。因此,在Django
.filter()
中,返回另一个
QuerySet
,QuerySet被惰性地计算,这意味着可以在循环中使用

因此,使用(
**
),我们可以组合
kwargs
,以传递到
.filter()

因为没有提供过滤器的确切数据类型/模式,所以我将使用字典作为示例,
filter\u dictionary
。在本词典中,
是将要使用的过滤器,
将是一个列表

# Compose first Queryset
qs = Model.objects.all()

# Loop over dictionary
for key, value in filter_dictionary.items():

    # Use unpacking to compose kwarg
    qs.filter(**{'{0}__in'.format(key): value})

# do something with the QuerySet

只需使用django_过滤器

from django_filters import rest_framework as filters    

class ContentFilter(filters.FilterSet):
    id = filters.NumberFilter(lookup_expr="in")
    country = filters.CharFilter(lookup_expr="in")

    class Meta:
        model = <your_model>
        fields = ['id', 'country']

使用
如果esle
检测json并更改查询,就像您在
查询集
中想要的那样,对于N个筛选器,将有N个ifs不是正确的方法。可能会有N个筛选器通过,因此如果else不是正确的方法。@ShubhamKumar也请澄清此mattter上的问题,能否添加视图/序列化程序作为问题的上下文?
filterset_class = ContentFilter