[PYTHON] Ändern Sie das Suffix von django-filter / DateFromToRangeFilter

schreiben

Wenn Sie das von django-filter bereitgestellte "DateFromToRangeFilter ()" verwenden, hat das Suffix des angegebenen Felds standardmäßig "_after" und "_before". Es nimmt die Dinge auf, die Sie angebracht haben, und schränkt den Bereich ein.

Diesmal wollte ich jedoch "_von" und "_zu" aufnehmen und den Bereich eingrenzen.

Es hat eine Weile gedauert, also werde ich es als Aufzeichnung schreiben.

Ich habe es auch in [GitHub] erwähnt (https://github.com/donaisore/django-docker/tree/django-filter/custom_date_from_to_range).

Vorbereitung

Erstellen Sie ein BlogModel mit einer Spalte "created_at" und erstellen Sie einen Endpunkt, um diese Liste abzurufen.

models.py


from django.db import models


class Blog(models.Model):
    title = models.CharField(max_length=255)
    created_at = models.DateTimeField(auto_now_add=True)

serializers.py


from rest_framework.serializers import ModelSerializer

from blogs.models import Blog


class BlogSerializer(ModelSerializer):
    class Meta:
        model = Blog
        fields = '__all__'

filters.py


from django_filters import rest_framework as filters

from blogs.models import Blog


class BlogFilter(filters.FilterSet):
    created_at = filters.DateFromToRangeFilter()

    class Meta:
        model = Blog
        fields = ['created_at']

views.py


from rest_framework.response import Response
from rest_framework.viewsets import ViewSet

from blogs.filters import BlogFilter
from blogs.models import Blog
from blogs.serializers import BlogSerializer


class BlogViewSet(ViewSet):
    def list(self, request):
        queryset = Blog.objects.all()
        queryset = BlogFilter(data=request.GET, queryset=queryset, request=request).qs
        serializer = BlogSerializer(queryset, many=True)
        return Response(serializer.data)

urls.py


from rest_framework.routers import DefaultRouter

from blogs.views import BlogViewSet

router = DefaultRouter(trailing_slash=False)

router.register(
    r'^blogs',
    BlogViewSet,
    basename='blogs'
)

urlpatterns = router.urls

Erstellen Sie schließlich am 24. Februar 2020 einen Datensatz in der Blog-Tabelle.

>>> blog1 = Blog.objects.create(title='blog1')
<Blog: Blog object (1)>
>>> blog1.created_at
datetime.datetime(2020, 2, 24, 5, 54, 52, 859528, tzinfo=<UTC>)

Sie können den Bereich jetzt angeben, indem Sie die Abfrageparameter "created_at_after" und "created_at_before" an "/ Blogs" übergeben.

>>> curl 'http://localhost:18000/blogs?created_at_after=2020-02-01&created_at_before=2020-02-02'
[]

>>> curl 'http://localhost:18000/blogs?created_at_after=2020-02-01&created_at_before=2020-02-28'
[{"id":1,"title":"blog1","created_at":"2020-02-24T05:54:52.859528Z"}]

Politik

Dieses Mal möchte ich das Standardsuffix "_after`," _before "ändern.

Ich dachte darüber nach, die Einstellung zu finden und wenn möglich zu überschreiben.

Werfen wir einen Blick in DateFromToRangeFilter. DateFromToRangeFilter(GitHub)

Dann stellte ich fest, dass für DateRangeWidget (GitHub) das Suffix wie folgt festgelegt wurde. Es war.

class DateRangeWidget(RangeWidget):
    suffixes = ['after', 'before']

Es wird in DateRangeField (GitHub) verwendet.

Von Oben

  1. Erstellen Sie ein benutzerdefiniertes Widget
  2. Erstellen Sie CustomDateRangeField
  3. Erstellen Sie CustomDateFromToRangeFilter Ich habe beschlossen, es so umzusetzen.

Implementierung

1. Erstellen Sie ein benutzerdefiniertes Widget

Stellen Sie sicher, dass das Suffix "_from", "_to" lautet

widgets.py


from django_filters.widgets import DateRangeWidget


class CustomDateRangeWidget(DateRangeWidget):
    suffixes = ['from', 'to']

2. Erstellen Sie CustomDateRangeField

Erstellen Sie mit CustomWidget ein Feld für den Filter.

fields.py


from django_filters.fields import DateRangeField

from blogs.widgets import CustomDateRangeWidget


class CustomDateRangeField(DateRangeField):
    widget = CustomDateRangeWidget

3. Erstellen Sie CustomDateFromToRangeFilter

Erstellen Sie einen Filter mit dem in 2 erstellten CustomDateRangeField.

filters.py


from django_filters import rest_framework as filters

from blogs.fields import CustomDateRangeField
from blogs.models import Blog


class CustomDateRangeFilter(filters.DateFromToRangeFilter):
    field_class = CustomDateRangeField


class BlogFilter(filters.FilterSet):
    # created_at = filters.DateFromToRangeFilter()
    created_at = CustomDateRangeFilter()

    class Meta:
        model = Blog
        fields = ['created_at']

Natürlich können die Standardeinstellungen "_after` und" _before "nicht verwendet werden.

Ich werde es bestätigen.

_after,_Versuchen Sie, vorher nicht verwenden zu können
>>> curl 'http://localhost:18000/blogs?created_at_after=2020-02-01&created_at_before=2020-02-02'
[{"id":1,"title":"blog1","created_at":"2020-02-24T05:54:52.859528Z"}]

>>> curl 'http://localhost:18000/blogs?created_at_after=2020-02-01&created_at_before=2020-02-28'
[{"id":1,"title":"blog1","created_at":"2020-02-24T05:54:52.859528Z"}]

_from, _Versuchen Sie, wie erwartet zu arbeiten
>>> curl 'http://localhost:18000/blogs?created_at_from=2020-02-01&created_at_to=2020-02-02'
[]

>>> curl 'http://localhost:18000/blogs?created_at_from=2020-02-01&created_at_to=2020-02-28'
[{"id":1,"title":"blog1","created_at":"2020-02-24T05:54:52.859528Z"}]

Jetzt können Sie das Suffix ändern.

Schließlich

Ich habe überhaupt keinen Django-Filter verwendet, aber es ist sehr praktisch.

Wenn jemand weiß, dass "dies leichter gelöst werden kann", wäre ich dankbar, wenn Sie mich wissen lassen könnten.

__Vielen Dank! __ __

Recommended Posts

Ändern Sie das Suffix von django-filter / DateFromToRangeFilter
Ändern Sie das Thema von Jupyter
Ändern Sie den Stil von matplotlib
Ändern Sie den Hintergrund von Ubuntu (GNOME)
Ändern Sie die Länge der Python-CSV-Zeichenfolgen
Skript zum Ändern der Beschreibung von Fasta
Ändern Sie die Reihenfolge von PostgreSQL in Heroku
Ändern Sie den Ziel-Batfish-Server von Pybatfish
Ändern Sie die Schriftgröße der Legende in df.plot
Ändern Sie die Farbe von Fabric-Fehlern und Warnungen
Ändern Sie den Dezimalpunkt der Protokollierung von, nach.
Ändern Sie die Auflösung von Ubuntu, das auf VirtualBox ausgeführt wird
[Touch Designer] Ändern Sie die Darstellungsfarbe von Button COMP
Die Bedeutung des Selbst
der Zen von Python
Die Geschichte von sys.path.append ()
[Django] Ändern Sie die Standard-IP-Adresse des Befehls runserver
Rache der Typen: Rache der Typen
[Python] Lassen Sie uns die URL der Django-Administrator-Site ändern
Eine Einführung in die Objektorientierung: Ändern Sie den internen Status eines Objekts
Ändern des Aufbewahrungszeitraums für CloudWatch-Protokolle in Lambda
Ändern Sie die Lautstärke von Pepper entsprechend der Umgebung (Ton).
Richten Sie die Version von chromedriver_binary aus
Scraping das Ergebnis von "Schedule-Kun"
10. Zählen der Anzahl der Zeilen
Auf dem Weg zum Ruhestand von Python2
Holen Sie sich die Anzahl der Ziffern
Erläutern Sie den Code von Tensorflow_in_ROS
Verwenden Sie die Clustering-Ergebnisse erneut
GoPiGo3 des alten Mannes
Berechnen Sie die Anzahl der Änderungen
Die Popularität von Programmiersprachen
Visualisieren Sie die Flugbahn von Hayabusa 2
Über die Komponenten von Luigi
Verknüpfte Komponenten des Diagramms
Filtern Sie die Ausgabe von tracemalloc
Über die Funktionen von Python
Simulation des Inhalts der Brieftasche
Die Kraft der Pandas: Python
So ändern Sie die Protokollstufe von Azure SDK für Python
So ändern Sie die Farbe nur der mit Tkinter gedrückten Taste
Ändern Sie die Y-Achsenskala von Matplotlib in die Exponentialschreibweise (10-te Potenzschreibweise).
Finden Sie die mysteriöse Veränderung der Pokemon-Bilderbuchbeschreibung nach Levenstein-Entfernung heraus
Fühlen Sie sich frei, das Legendenlabel mit Seaborn in Python zu ändern
[Los] Erstellen Sie einen CLI-Befehl, um die Erweiterung des Bildes zu ändern
Ich habe zusammengefasst, wie die Boot-Parameter von GRUB und GRUB2 geändert werden
Was passiert, wenn ich die Hyperparameter von SVM (RBF-Kernel) ändere?