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.
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"}]
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
Assurez-vous que le suffixe est _from
, _to
widgets.py
from django_filters.widgets import DateRangeWidget
class CustomDateRangeWidget(DateRangeWidget):
suffixes = ['from', 'to']
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
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.
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