django-filter에서 같은 생일 사람을 검색하고 싶습니다!

소개



이 기사는 장고 Advent Calendar 2020 9일째 기사입니다.
2년 연속 2회째의 참가입니다.

django-filter를 사용하여 같은 생일의 사람 (월일이 동일)을 얻고 싶었습니다.



샘플을 만들었습니다.
django-filter에서 같은 생일 사람을 검색하는 샘플

생년월일을 DateField로 가지고 있으므로, 그대로 django-filter를 사용하면 이런 느낌↓


생년월일 전부 같은 사람이 아니라, 생일의 연월이 같은 사람을 취득하고 싶습니다만, 이것이라면 「날짜를 올바르게 입력해 주세요」가 됩니다.
YYYY-MM-DD 형식으로 입력하지 않았기 때문입니다.

DateField 의 월일만을 검색하려면 (api)/views.py 에 필터 세트를 작성합니다.

(api)/views.py
from django_filters import rest_framework as filters
from rest_framework import viewsets

from sample.models import Samplepeople
from sampleapi.serializers import SamplepeopleSerializers

# フィルタセット
class SampleFilter(filters.FilterSet):
    # Date型の月、日をそれぞれ検索できるようにする
    birthday_month = filters.NumberFilter(field_name='date_of_birth', lookup_expr='month')
    birthday_day = filters.NumberFilter(field_name='date_of_birth', lookup_expr='day')

    class Meta:
        model = Samplepeople
        fields = ['id', 'name', 'kana', 'date_of_birth',]

# 通常のViewSet
class SampleViewSet(viewsets.ReadOnlyModelViewSet):

    queryset = Samplepeople.objects.all()
    serializer_class = SamplepeopleSerializers
    filter_backends = [filters.DjangoFilterBackend]
    # 上記のFilterを追加する
    filter_class = SampleFilter

필터 세트로 설정한 항목이 추가됩니다.


즉시 같은 생일 사람을 검색합니다.


태어난 해는 다르지만 같은 달과 같은 사람이 검색되었습니다.


그리고는 API 두드릴 때에 ?birthday_month=&birthday_day= 에 달과 일을 넣어 주면 OK입니다.
이것이라면 같은 탄생월의 사람을 검색하는 것도 손쉽네요. lookup_expr='year'를 추가하여 같은 해에 태어난 사람을 검색 할 수도 있습니다.

DateTimeFilter가 아님



DateField 검색이므로 DateTimeFilter를 사용합니까? 라고 생각했는데, 처음의 녀석과 같이 「날짜를 올바르게 입력해 주세요」가 됩니다.
DateTimeFilter도 YYYY-MM-DD(YYYY-MM-DD HH24-mm-SS) 형식으로 입력해야 하기 때문입니다(1패)

결론



더 좋은 방법이 있다면 알려주세요.

참고



  • 의사 개인정보 데이터 생성 서비스
  • 샘플 데이터를 만들었습니다

  • Django REST framework에서 django-filter 사용
  • 현장에서 사용할 수 있는 Django REST Framework 교과서
  • 좋은 웹페이지 즐겨찾기