[PYTHON] Changer le suffixe de django-filter / DateFromToRangeFilter

écrire

Si vous utilisez le DateFromToRangeFilter () fourni par django-filter, par défaut, le suffixe du champ spécifié aura _after et _before. Il ramassera les choses que vous avez attachées et réduira la gamme.

Cependant, cette fois, je voulais choisir _from et _to et réduire la plage.

Cela a pris un certain temps, alors je vais l'écrire comme un disque.

Je l'ai également mentionné dans GitHub.

Préparation

Créez un BlogModel avec une colonne created_at et créez un point de terminaison pour obtenir cette liste.

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

Enfin, créez un enregistrement dans la table Blog le «24 février 2020».

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

Vous pouvez maintenant spécifier la plage en passant les paramètres de requête created_at_after et created_at_before à / blogs.

>>> 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"}]

politique

Ce que je veux faire cette fois est de changer le suffixe par défaut _after, _before.

J'ai pensé à trouver le réglage et à le remplacer si possible.

Jetons un coup d'œil à l'intérieur de DateFromToRangeFilter. DateFromToRangeFilter(GitHub)

Ensuite, j'ai trouvé que DateRangeWidget (GitHub) a un suffixe défini comme ceci. C'était.

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

Il est utilisé dans DateRangeField (GitHub).

De ce qui précède

  1. Créez un widget personnalisé
  2. Créez CustomDateRangeField
  3. Créez CustomDateFromToRangeFilter J'ai décidé de le mettre en œuvre comme ça.

la mise en oeuvre

1. Créez un widget personnalisé

Assurez-vous que le suffixe est _from, _to

widgets.py


from django_filters.widgets import DateRangeWidget


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

2. Créez CustomDateRangeField

Créez un champ à utiliser pour le filtre à l'aide de CustomWidget.

fields.py


from django_filters.fields import DateRangeField

from blogs.widgets import CustomDateRangeWidget


class CustomDateRangeField(DateRangeField):
    widget = CustomDateRangeWidget

3. Créez CustomDateFromToRangeFilter

Créez un filtre en utilisant le CustomDateRangeField créé dans 2.

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']

Bien entendu, les valeurs par défaut «_after» et «_before» ne peuvent pas être utilisées.

Je vais le confirmer.

_after,_Essayez de ne pas pouvoir utiliser avant
>>> 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, _Essayez de travailler comme prévu
>>> 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"}]

Vous pouvez maintenant changer le suffixe.

finalement

Je n'ai pas du tout utilisé django-filter, mais c'est très pratique.

Si quelqu'un sait que "ceci peut être résolu plus facilement", je vous serais reconnaissant de bien vouloir me le faire savoir.

__Merci beaucoup! __

Recommended Posts

Changer le suffixe de django-filter / DateFromToRangeFilter
Changer le thème de Jupyter
Changer le style de matplotlib
Changer l'arrière-plan d'Ubuntu (GNOME)
Changer la longueur des chaînes csv Python
Script pour changer la description de fasta
Changer l'ordre de PostgreSQL dans Heroku
Changer le serveur Batfish de destination de pybatfish
Changer la taille de police de la légende dans df.plot
Changer la couleur des erreurs et avertissements Fabric
Modifiez le point décimal de la journalisation de, à.
Changer la résolution d'Ubuntu s'exécutant sur VirtualBox
[Touch Designer] Changer la couleur d'apparence du bouton COMP
Le sens de soi
le zen de Python
L'histoire de sys.path.append ()
[Django] Changer l'adresse IP par défaut de la commande runserver
La vengeance des types: la vengeance des types
[Python] Changeons l'URL du site administrateur de Django
Une introduction à l'orientation des objets - changeons l'état interne d'un objet
Modifier la période de conservation des journaux CloudWatch Logs dans Lambda
Changer le volume de Pepper en fonction de l'environnement environnant (son)
Aligner la version de chromedriver_binary
Grattage du résultat de "Schedule-kun"
10. Compter le nombre de lignes
Vers la retraite de Python2
Obtenez le nombre de chiffres
Expliquez le code de Tensorflow_in_ROS
Réutiliser les résultats du clustering
GoPiGo3 du vieil homme
Calculez le nombre de changements
La popularité des langages de programmation
Visualisez la trajectoire de Hayabusa 2
À propos des composants de Luigi
Composants liés du graphique
Filtrer la sortie de tracemalloc
À propos des fonctionnalités de Python
Simulation du contenu du portefeuille
Le pouvoir des pandas: Python
Comment modifier le niveau de journalisation d'Azure SDK pour Python
Comment changer la couleur du seul bouton pressé avec Tkinter
Changer l'échelle de l'axe Y de Matplotlib en notation exponentielle (10 Nth power notation)
Découvrez le changement mystérieux de la description du livre illustré Pokemon par Levenstein Distance
N'hésitez pas à changer l'étiquette de légende avec Seaborn en python
[Go] Créez une commande CLI pour changer l'extension de l'image
J'ai résumé comment changer les paramètres de démarrage de GRUB et GRUB2
Que se passe-t-il lorsque je change les hyper paramètres de SVM (noyau RBF)?