我在django-filter包中使用了Django REST框架,但我的问题主要是关于django-filter的。我不明白如何在"__in“查找中使用过滤器。
例如,我有以下模型:
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‘查找?
发布于 2020-01-30 23:04:36
现在django_filter有一个简单的解决方案:
class BookView(viewsets.ReadOnlyModelViewSet):
serializer_class = BookSerializer()
model = Book
filter_fields = {
'id': ['exact', 'in'],
'name': ['exact']
}然后,您可以在查询字符串中使用它,就像您想要的那样:?id__in=1,2,3。
发布于 2015-07-15 00:37:29
这个问题将在本期中讨论:https://github.com/alex/django-filter/issues/137#issuecomment-77697870
建议的解决方案是创建自定义筛选器,如下所示:
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
发布于 2019-08-02 16:12:36
django-filter提供了与其他过滤器类(如NumberFilter、CharFilter )结合使用的BaseInFilter。此类仅验证传入请求是否为书本。如果您使用的是Web Browsable API,则可以将请求发送为/comma-separated/?id__in=1%2C3,其中%2C是逗号。
filters.py
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
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 = BookSerializerhttps://stackoverflow.com/questions/18016543
复制相似问题