通过django-filter过滤价格范围

zzzyeukh  于 2022-11-18  发布在  Go
关注(0)|答案(2)|浏览(179)

我通过Django-filter添加了一个价格范围过滤器,但似乎不起作用。
filters.py

from django_filters import FilterSet
from .models import Apartment

class ApartmentFilter(FilterSet):
    class Meta:
        model = Apartment
        fields = {
            'price': ['lt','gt']
        }

views.py

class ApartmentViewSet(viewsets.ModelViewSet):
    queryset = Apartment.objects.all().order_by('-timestamp')
    serializer_class = ApartmentSerializer
    permission_classes = [
        permissions.IsAuthenticatedOrReadOnly, IsOwnerApartmentOrReadOnly]

    filter_backends = [filters.SearchFilter,
                       DjangoFilterBackend, filters.OrderingFilter]
    filter_class = ApartmentFilter
    search_fields = ['address']
    filterset_fields = ['category', 'district']
    ordering_fields = ('price',)
50pmv0ei

50pmv0ei1#

您可以使用内置的RangeFilter

from django_filters import FilterSet, RangeFilter

class ApartmentFilter(FilterSet):
    price = RangeFilter()

    class Meta:
        model = Apartment
        fields = ['price']

然后,在请求参数中将其作为price_minprice_max发送。
例如<your_api_endpoint>/?price_min=100&price_max=200

7uhlpewt

7uhlpewt2#

class ApartmentFilter(filters.FilterSet):
    min_price = filters.NumberFilter(field_name="price", lookup_expr='gt')
    max_price = filters.NumberFilter(field_name="price", lookup_expr='lt')
    class Meta:
        model = Apartment
        fields = ['category', 'district']

class ApartmentViewSet(viewsets.ModelViewSet):
    queryset = Apartment.objects.all().order_by('-timestamp')
    serializer_class = ApartmentSerializer
    permission_classes = [permissions.IsAuthenticatedOrReadOnly, IsOwnerApartmentOrReadOnly]
    filter_backends = [filters.SearchFilter, DjangoFilterBackend, filters.OrderingFilter]
    filter_class = ApartmentFilter
    search_fields = ['address']

有关文档here的更多信息

相关问题