如何根据传递的过滤器编写动态 django orm 查询集?



>我需要根据从前端作为 JSON 传递的过滤器在查询集上动态应用过滤器。

例如。

如果 JSON 传递的是:{ id:[1,2,3] } 则查询集将为:Model.objects.filter(id__in=id(

如果 JSON 传递为:{ id:[1,2,3],国家:['印度','澳大利亚'] }

则查询集将为:Model.objects.filter(id__in=id,country__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并且查询集被延迟计算,这意味着它们可以被链接并在循环中使用。

所以使用解包(**(,我们可以编写要传递给.filter()kwargs

由于没有提供过滤器的确切数据类型/模式,我将使用字典作为示例,filter_dictionary.在此字典中,key是将使用的过滤器,value将是一个列表。

# 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_filters

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']

然后添加到视图类

filterset_class = ContentFilter

最新更新