gpt4 book ai didi

python - DRF - 是否可以将 URL 中的多个过滤器参数与某种 OR 逻辑符号结合起来

转载 作者:太空狗 更新时间:2023-10-30 00:02:10 34 4
gpt4 key购买 nike

我使用 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

现在如果我提出这样的请求:

/api/rest/v1/Person?first_name=foo&last_name=foo&page_size=10

这只返回那些名字和姓氏都包含“foo”的对象。我想返回那些名字包含“foo”或姓氏包含“foo”的对象。

我想知道在 URL 参数中是否有一个可用的符号,这将表示过滤器之间的逻辑或关系。

一种解决方法是向端点发出两个单独的 AJAX 查询,但这需要额外的工作来统一结果。

最佳答案

不幸的是,当前的 django_filter 实现是不可能的。每个过滤器都会就地修改查询集,而不是返回 Q 对象,这可以根据您的喜好加入。您可以尝试覆盖 FilterSet.qs() 方法并在 self._qs.query.where 上使用一些黑魔法来使用 OR 重新组合子句.另见关于 editing the queryset filters 的问题.

更新:只要 Django 能很好地处理 SQL 注入(inject)尝试,您就可以使用类似的东西:

qs.filter(map(operators.or_, [Q(k=v) for k, v in request.GET.items()]))

,但在投入生产之前肯定需要一些验证。

关于python - DRF - 是否可以将 URL 中的多个过滤器参数与某种 OR 逻辑符号结合起来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34626050/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com