2 回答

TA贡献2039条经验 获得超7个赞
当然,您可以通过使用具有特定字段“小部件”的自定义过滤器集类来做到这一点(这就是它在 django-filters 中的调用方式)
这是您可以尝试的示例:
# filters.py
from django_filters.rest_framework import FilterSet, filters
from django_filters.widgets import CSVWidget
from .your_models import Tag, TaggableModel
class TaggableModelFilterSet(FilterSet):
tags = filters.ModelMultipleChoiceFilter(
queryset=Tag.objects.all(), widget=CSVWidget,
help_text=_("A list of ids, comma separated, identifying tags"),
method='filter_tags'
)
class Meta:
model = TaggableModel
fields = ['tags']
def filter_tags(self, queryset, name, value):
if value:
queryset = queryset.filter(tags__in=value)
return queryset
# views.py
class TaggableModelViewSet(viewsets.ModelViewSet):
queryset = TaggableModel.objects.all()
serializer_class = TaggableModelSerializer
permission_classes = (AllowAny,)
filter_backends = [DjangoFilterBackend]
filter_class = TaggableModelFilterSet

TA贡献1828条经验 获得超6个赞
django-filter使用package有一种更简单的方法来实现这一点。django-filter在文档的深处,它提到您可以使用“映射到查找列表的字段名称字典”。
您的代码将像这样更新:
# views.py
from django_filters.rest_framework import DjangoFilterBackend
class TaggableModelViewSet(viewsets.ModelViewSet):
queryset = TaggableModel.objects.all()
serializer_class = TaggableModelSerializer
permission_classes = (AllowAny,)
filter_backend = [DjangoFilterBackend]
filterset_fields = {
'tags': ["in", "exact"] # note the 'in' field
}
现在在 URL 中,您将__in在提供参数列表之前添加到过滤器中,它会按预期工作:
https://my-api-domain/api/taggable-models?tags__in=1,2,3
关于哪些查找过滤器可用的django-filter文档非常差,但是在Django 文档本身in中提到了查找过滤器。
添加回答
举报