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).
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"}]
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
Stellen Sie sicher, dass das Suffix "_from", "_to" lautet
widgets.py
from django_filters.widgets import DateRangeWidget
class CustomDateRangeWidget(DateRangeWidget):
suffixes = ['from', 'to']
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
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.
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