2

Ich arbeite mit Django Rest Framework API, ich versuche, einen Filter von first_name oder by last_name oder von beiden zu machen. Das ist mein ContactViewSet.py:Django Filter Backend

class ContactViewSet(viewsets.ModelViewSet): 
    queryset = Contact.objects.all() 
    serializer_class = ContactSerializer 
    filter_backends = (DjangoFilterBackend,) 
    filter_fields = ('first_name', 'last_name') 
    lookup_field = 'idContact' 

Meine DRF Einstellungen:

REST_FRAMEWORK = { 
    'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',), 
} 

Meine actuel Anforderungs-URL wie folgt aussieht:

http://localhost:8000/api/v1/contacts/?first_name=Clair&last_name=Test 

Aber ich bin für so etwas wie folgt aussehen:

http://localhost:8000/api/v1/contacts/?first_name=Cl**&last_name=Tes** 

Jede mögliche Hilfe würde geschätzt werden.

+0

Nicht in der Lage diese atm zu testen ... ist 'first_name__startswith = Cl' arbeiten? .. – Sayse

+0

Nein, das Problem ist, dass ich genau in dem first_name ausfüllen – Naella

+0

zu filtern Wenn Sie nur daran interessiert sind, Filtern nach Abfrageparametern, dann wird das Schreiben eines benutzerdefinierten Managers tun, was auch immer Sie tun möchten. – zaidfazil

Antwort

0

I löste mein Problem, indem ich meine Klasse ContactFilter so änderte:

import django_filters 
from .models import Contact 

class ContactFilter(django_filters.FilterSet): 
    class Meta: 
     model = Contact 
     fields = { 
      'first_name': ['startswith'], 
      'last_name': ['startswith'], 
     } 
     together = ['first_name', 'last_name'] 

Und meiner Ansicht nach hatte ich dies nur tun:

class ContactViewSet(viewsets.ModelViewSet): 
    queryset = Contact.objects.all() 
    serializer_class = ContactSerializer 
    filter_class = ContactFilter 

url Meine Anfrage wie folgt aussieht:

http://localhost:8000/api/v1/contact/?first_name__contains=Cl&last_name__contains=Tes 

Aber ich frage mich immer noch, wenn ich kann so etwas in Django

haben
http://localhost:8000/api/v1/contacts/?first_name=Cl**&last_name=Tes** 
2

Ich denke, dass das DjangoFilterBackend hauptsächlich Gleichheit-basierte Filterung ist. Aber Sie können customize the filtering method.

Auch in DRF, für nicht exakte Filterung, gibt es die SearchFilter, die standardmäßig die Suche nach partiellen Übereinstimmungen ohne Berücksichtigung der Groß- und Kleinschreibung macht.

+0

Danke für deine Wiederholung! Aber der SearchFilter erlaubt mir nicht, eine Anfrage URL wie folgt zu haben: http: // localhost: 8000/api/v1/contacts /? Vorname = Cl ** & last_name = Tes ** – Naella

+0

Dann Anpassung der Filterung von Django-Filter könnte der beste Weg sein, [Dieser Artikel] (https://simpleisbetterthancomplex.com/tutorial/2016/11/28/how-to-filter-querysets-dynamically.html) könnte Ihnen helfen, das zu tun, und die Dokumentation, die ich in der Antwort verlinkt. –

+0

Bitte sehen Sie sich die Antwort unten an.Danke – Naella

1

Ich arbeite mit Viewsets, sieht meine contactViewSet wie:

class ContactViewSet(viewsets.ModelViewSet): 
    serializer_class = ContactSerializer 
    filter_class = ContactFilter 

    def get_queryset(self): 
     return Contact.objects.all() 

Und mein Filter wie

haben sieht
from .models import Contact 

class ContactFilter(django_filters.FilterSet): 
    first_name = django_filters.CharFilter(method="my_custom_filter") 

    class Meta: 
     model = Contact 
     fields = ['first_name'] 

    def my_custom_filter(self, queryset, first_name, value): 
     return queryset.filter(**{ 
      first_name: value, 
     }) 

aber immer noch das gleiche Problem

+0

Wenn du eine neue Frage hast, frag sie bitte, indem du auf die Schaltfläche [Frage stellen] (https://stackoverflow.com/questions/ask) klickst . Fügen Sie einen Link zu dieser Frage hinzu, wenn es hilft, Kontext bereitzustellen. - [Aus Bewertung] (/ review/low-quality-posts/16833094) –