【问题标题】:Filtering using URL with DRF使用带有 DRF 的 URL 进行过滤
【发布时间】:2017-07-17 15:19:48
【问题描述】:

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

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

这是我的代码:

模型.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)

网址.py

router.register(r'tag', TagViewSet)

我希望能够像这样过滤:

xyz.com/tag?level=40/

只显示40级的所有物品。

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

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

过滤器.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

【问题讨论】:

  • Tag 模型中的字段名称是level 时,为什么level="level"FilterSet 中以及taglevel 字段是什么?
  • 修复了这个问题——粘贴错误

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


【解决方案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()

【讨论】:

    猜你喜欢
    • 2018-08-02
    • 1970-01-01
    • 2019-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-14
    • 2019-05-25
    • 1970-01-01
    相关资源
    最近更新 更多