首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Django-filter的'__in‘查找?

如何使用Django-filter的'__in‘查找?
EN

Stack Overflow用户
提问于 2013-08-02 20:09:38
回答 9查看 11.7K关注 0票数 17

我在django-filter包中使用了Django REST框架,但我的问题主要是关于django-filter的。我不明白如何在"__in“查找中使用过滤器。

例如,我有以下模型:

代码语言:javascript
复制
class Book(models.Model):
   name = models.CharField(max_length=100)

class BookView(viewsets.ReadOnlyModelViewSet):
   serializer_class = BookSerializer()
   model = Book
   filter_fields = ('id', 'name')

而且我不能使用像/v1/books/?id__in=1,2,3这样的URL来查找id为1、2或3的图书。

如何使用Django-filter的'__in‘查找?

EN

回答 9

Stack Overflow用户

发布于 2020-01-30 23:04:36

现在django_filter有一个简单的解决方案:

代码语言:javascript
复制
class BookView(viewsets.ReadOnlyModelViewSet):
   serializer_class = BookSerializer()
   model = Book
   filter_fields = {
      'id': ['exact', 'in'],
      'name': ['exact']
   }

然后,您可以在查询字符串中使用它,就像您想要的那样:?id__in=1,2,3

票数 8
EN

Stack Overflow用户

发布于 2015-07-15 00:37:29

这个问题将在本期中讨论:https://github.com/alex/django-filter/issues/137#issuecomment-77697870

建议的解决方案是创建自定义筛选器,如下所示:

代码语言:javascript
复制
from django_filters import Filter
from django_filters.fields import Lookup

from .models import Product

class ListFilter(Filter):
    def filter(self, qs, value):
        value_list = value.split(u',')
        return super(ListFilter, self).filter(qs, Lookup(value_list, 'in'))

class ProductFilterSet(django_filters.FilterSet):
    id = ListFilter(name='id')

    class Meta:
        model = Product
        fields = ['id']

你可以写下以下代码:

产品/?id=7,8,9

票数 5
EN

Stack Overflow用户

发布于 2019-08-02 16:12:36

django-filter提供了与其他过滤器类(如NumberFilterCharFilter )结合使用的BaseInFilter。此类仅验证传入请求是否为书本。如果您使用的是Web Browsable API,则可以将请求发送为/comma-separated/?id__in=1%2C3,其中%2C是逗号。

filters.py

代码语言:javascript
复制
import django_filters


class NumberInFilter(django_filters.BaseInFilter, django_filters.NumberFilter):
    pass


class BookFilter(django_filters.FilterSet):
    id__in = NumberInFilter(field_name="id", lookup_expr="in")

views.py

代码语言:javascript
复制
from rest_framework import viewsets
from django_filters import rest_framework as filters

from book.filters import BookFilter
from book.models import Book
from book.serializers import BookSerializer


class BookViewSet(viewsets.ReadOnlyModelViewSet):
    queryset = Book.objects.all()
    filter_backends = (filters.DjangoFilterBackend, )
    filterset_class = BookFilter
    serializer_class = BookSerializer
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18016543

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档