Filter in django rest framework
In meinem Projekt verwende ich django rest framework. Um die Ergebnisse zu filtern ich benutze django_filters backend.
Es ist mein code:
models.py
from django.db import models
class Region(models.Model):
name = models.CharField(max_length=100, blank=True, null=False)
class Town(models.Model):
region = models.ForeignKey(Region)
name = models.CharField(max_length=100, blank=True, null=False')
filters.py
import django_filters
from models import Town
class TownFilter(django_filters.FilterSet):
region = django_filters.CharFilter(name="region__name", lookup_type="contains")
town = django_filters.CharFilter(name="name", lookup_type="contains")
class Meta:
model = Town
fields = ['region', 'town']
views.py
from models import Town
from rest_framework import generics
from serializers import TownSerializer
from filters import TownFilter
class TownList(generics.ListAPIView):
queryset = Town.objects.all()
serializer_class = TownSerializer
filter_class = TownFilter
So, ich kann schreiben,?region=Region_name&Stadt=Town_name am Ende der Anfrage-url, und das Ergebnis gefiltert werden.
Aber ich will mit nur einem get-Parameter in der request-url, die region oder Stadt name als Wert. Zum Beispiel ?Suche=Region_name und ?Suche=Town_name. Wie kann ich dies tun?
InformationsquelleAutor Albert Iskhakov | 2014-03-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es ein paar Optionen, aber die einfachste Möglichkeit ist, einfach überschreiben 'get_queryset' in der API ansehen.
Beispiel aus der docs abgestimmt auf Ihren Anwendungsfall:
Ein anderer Weg ist, um Ihre
search_fields
auf der Liste der api-Klasse anzeigen in Kombination verwenden, dieSearchFilter
Klasse. Das problem ist, dass wenn Sie die Filterung über mehrere Modelle, müssen Sie möglicherweise einige zusätzliche Umsetzung hier, um stellen Sie sicher, es ist der Blick auf genau das, was Sie wollen. Wenn Sie nicht tun, nichts besonderes, nur doppelte Unterstriche für die region für Beispiel:region__name
Ich verstehe nicht, warum eine SearchFilter oder einfach überschreiben queryset nicht erfüllen genau das. Ich kann nicht wissen, was deine Absicht ist, weil Sie nicht bitten, dass Ihre Frage ein, sondern Sie fragte nur für 1 Suche param. Fügen Sie einfach ein zweites ich.Anfrage.QUERY_PARAMS.get('param1', "None") zum Beispiel. Dann wieder die queryset. Alternativ, einfach so in die SearchFilter.
Ich habe 25 Felder im Modell, die ich verwenden will in den filter. Und nur Stadt und region, die Felder sollten zusammen in suchen, HOLEN var in der url. 'search_fields' funktioniert nur mit einer GET-var. Und ob ich überschreiben 'get_queryset', dann sollte ich schreiben QUERY_PARAMS.get('param1', None) 23-mal.
So bitte formulieren Sie Ihre Frage, das ist nicht das, was Sie gefragt auf alle. Warum wollen Sie den filter über 25 Felder? Ich würde mich Fragen: erste - vielleicht haben Sie einen guten Grund. Meist ist es eine wirklich schlechte Idee, aber da Sie normalerweise nicht haben würden 25 abdeckende Indizes für die Felder, D. H. es läuft schrecklich langsam man erwarten würde. Wenn Sie wirklich brauchen, 25 Felder, ein Programmierer und schreiben Sie einfach eine einfache Funktion, die der Abfrage entspricht param das Feld (einfach, wenn es 1:1, ansonsten erstellen Sie ein dict) und erstellt die Abfrage. Dies ist ein klassisches builder pattern.
Lesen Sie bitte auch die docs in meiner Antwort. Es besagt ausdrücklich, "Beachten Sie, dass Sie sowohl eine außer Kraft gesetzt .get_queryset() und generische Filterung zusammen, und alles funktioniert wie erwartet." In anderen Worten, wieder, ich weiß nicht, wie es wird Ihnen ein problem. Ich habe nicht den code für Sie schreiben, also ist es bis zu Ihnen.
InformationsquelleAutor therewillbesnacks