>我需要根据从前端作为 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