在 Django Rest Framework 中过滤多个值

Pat*_*Pel 5 filtering django-rest-framework django-rest-viewsets

我有一个模型想要过滤多个值。

我的模型:

class Product(models.Model):
    ean = models.CharField(max_length=13, unique=True)
    product_id = models.CharField(max_length=20, null=True, blank=True)
    product_image = models.URLField(max_length=300, null=True, blank=True)
    product_title = models.CharField(max_length=300, null=True, blank=True)
Run Code Online (Sandbox Code Playgroud)

我要么想在“ean”字段上进行过滤,要么在主键上进行过滤,两者都可以。根据我当前的设置,我只能看到最后一个值。例如,当我将 URL 构造为www.example.com/api/Product/?id=1&id=2时,我只能看到 id 为 2 的产品,而我想查看 id 为 1 和 id 2 的产品。

我应该如何构建我的 ViewSet?目前我有:

class ProductViewSet(ModelViewSet):
    queryset = models.Product.objects.all()
    serializer_class = serializers.ProductSerializer
    filter_backends = [DjangoFilterBackend]
    filter_fields  = ('id','ean')
Run Code Online (Sandbox Code Playgroud)

Jos*_*eia 27

有一种更简单的方法可以使用django-filter来实现这一点。django-filter在文档的深处,它提到您可以使用“映射到查找列表的字段名称字典”。

您的代码将像这样更新:

# views.py

from django_filters.rest_framework import DjangoFilterBackend

class ProductViewSet(ModelViewSet):
    queryset = models.Product.objects.all()
    serializer_class = serializers.ProductSerializer
    filter_backends = [DjangoFilterBackend]
    filterset_fields = {
        'id': ["in", "exact"], # note the 'in' field
        'ean': ["exact"]
    }
Run Code Online (Sandbox Code Playgroud)

现在,在 URL 中,您可以__in在提供参数列表之前添加到过滤器,它将按您的预期工作:

www.example.com/api/Product/?id__in=1,2
Run Code Online (Sandbox Code Playgroud)

django-filter关于可用查找过滤器的文档非常少,但Django文档in本身提到了查找过滤器。

  • `filterset_fields` 而不是 filter_fields 对我有用 (3认同)