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