2017-02-27 48 views
0

我正在嘗試使用我的URL進行基本過濾。我嘗試了幾種解決方案,但沒有成功使用帶有DRF的URL進行過濾

請提出一個簡單的解決方案。當然有一個通用的解決方案

這裏是我的代碼:

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) 

我希望能夠過濾像e:

xyz.com/tag?level=40/ 

僅顯示級別爲40的所有項目。

使用django過濾器(不要誤會爲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 
+0

爲什麼'水平= 「級別」''中和FilterSet'是什麼'taglevel'場時,在字段名稱'標記'模型是'水平'而不是? – AKS

+0

修復了最新的粘貼錯誤 – Ycon

+0

您也可以考慮使用https://github.com/manjitkumar/drf-url-filters –

回答

1

我用Django的過濾器,以及URL過濾器來代替。最小代碼是必需的。我推薦使用django過濾器。

我也想能夠結合水平(如寫入API /水平/ 1 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()