2017-02-27 3 views
0

Ich versuche, grundlegende Filterung mit meiner URL zu tun. Ich habe mehrere Lösungen ohne Erfolg ausprobiert.Filterung mit URL mit DRF

Bitte schlagen Sie eine einfache Lösung vor. Sicherlich gibt es eine generische Lösung

Hier ist mein Code:

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) 

I möchte lik filtern können e dies:

xyz.com/tag?level=40/ 

Um alle Elemente mit einer Ebene von nur 40 anzuzeigen.

Mit Django-Filter (nicht zu verwechseln mit DjangoFilter S) habe ich eine neue filters.py-Datei erstellt.

Die Ergebnisse werden jedoch nie gefiltert. Wenn ich die API URL treffe, gibt es mir nur alle Ergebnisse.

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

Warum 'level = "Ebene"' in 'FilterSet' und was' taglevel' Feld ist, wenn der Feldname in der "Tag" -Modell ist stattdessen "level"? – AKS

+0

Behoben, dass Up- war ein Einfügen Fehler – Ycon

+0

Sie können auch über https://github.com/manjitkumar/drf-url-filters in Betracht ziehen –

Antwort

1

I verwendet django-Filter und die URL-Filter statt. Minimaler Code wurde benötigt. Ich empfehle dies über Django-Filter.

Ich würde auch gerne in der Lage sein Ebenen zu kombinieren (zB schreiben api/level/1 3) aber wenn niemand antwortet, verstehe ich, dass es außerhalb des Umfangs meiner ursprünglichen Frage ist.

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()