使用带DRF的URL过滤

时间:2017-02-27 05:39:44

标签: python django django-rest-framework django-filter

我正在尝试使用我的网址进行基本过滤。我尝试了几种解决方案但没有成功。

请提出一个直接的解决方案。当然有一个通用的解决方案

这是我的代码:

Models.py

class Tag(models.Model):
    name = models.CharField("Name", max_length=5000, blank=True)
    level = models.IntegerField("Level", null=True, blank=True)

Views.py

class TagFilterBackend(filters.BaseFilterBackend):
    def filter_queryset(self, request, queryset, view):
        return queryset.filter(owner=request.user)

Urls.py

router.register(r'tag', TagViewSet)

我希望能够像这样过滤:

xyz.com/tag?level=40/

仅显示40级的所有项目。

使用django-filter(不要误认为是DjangoFilter S ),我创建了一个新的filters.py文件。

但是,结果永远不会被过滤掉。当我点击API网址时,它只会给我所有结果。

Filter.py

from rest_framework import generics
from django_filters import rest_framework as filters
from Tril.models import Tag
from .serializers import TagSerializer

class TagFilter(filters.FilterSet):
    min_price = filters.NumberFilter(level="level", lookup_expr='gte')
    max_price = filters.NumberFilter(level="level", lookup_expr='lte')

    class Meta:
        model = Tag
        fields = ['level', 'name']


class ProductList(generics.ListAPIView):
    queryset = Tag.objects.all()
    serializer_class = TagSerializer
    filter_backends = (filters.DjangoFilterBackend,)
    filter_class = TagFilter

1 个答案:

答案 0 :(得分:1)

我使用了django-filter和URL过滤器。需要最少的代码。我建议使用django-filters。

我也希望能够组合级别(例如写api / level / 1& 2& 3),但如果没有人回答我理解它超出了原始问题的范围。

filters.py

from rest_framework import filters, generics
from .serializers import TagSerializer
from Tril.models import Tag

class TagLevel(generics.ListAPIView):
    serializer_class = TagSerializer

    def get_queryset(self):
        taglevel = self.kwargs['level']
        return Tag.objects.filter(level=level)

urls.py

url('^level/(?P<level>.+)/$', Level.as_view()