Csa*_*oth 6 python django url django-rest-framework
我使用Django REST Framework构建了一个REST端点.
class PersonFilter(django_filters.FilterSet):
id = django_filters.NumberFilter(name="id", lookup_type="gt")
first_name = django_filters.CharFilter(name="first_name", lookup_type="icontains")
last_name = django_filters.CharFilter(name="last_name", lookup_type="icontains")
class Meta:
model = Person
fields = ('id', 'first_name', 'last_name', 'last_mod')
class PersonModelViewSet(viewsets.ReadOnlyModelViewSet):
queryset = Person.objects.none()
filter_backends = (filters.DjangoFilterBackend, filters.SearchFilter, filters.OrderingFilter)
pagination_class = StandardResultsSetPagination
ordering_fields = ('id', 'first_name', 'last_name', 'last_mod')
ordering = ('last_mod', 'id')
filter_class = PersonFilter
Run Code Online (Sandbox Code Playgroud)
现在,如果我提出这样的请求:
/api/rest/v1/Person?first_name=foo&last_name=foo&page_size=10
Run Code Online (Sandbox Code Playgroud)
这仅返回名字和姓氏都包含"foo"的对象.我想返回名字中包含"foo"或姓氏包含"foo"的那些对象.
我想知道URL参数中是否有可用的符号,这意味着过滤器之间的逻辑或关系.
一种解决方法是向端点发出两个单独的AJAX查询,但这需要额外的工作来统一结果.
不幸的是,当前的实现是不可能的django_filter。每个过滤器都会就地修改查询集,而不是返回对象Q,这可以根据您的喜好进行添加。您可以尝试覆盖该FilterSet.qs()方法并使用一些黑魔法self._qs.query.where来重新组合子句OR。另请参阅有关编辑查询集过滤器的问题。
更新:只要 Django 能够很好地处理 SQL 注入尝试,您就可以使用如下内容:
qs.filter(map(operators.or_, [Q(k=v) for k, v in request.GET.items()]))
Run Code Online (Sandbox Code Playgroud)
,但在投入生产之前肯定需要一些验证。