2017-10-26 68 views
0

誕生日に誕生日をフィルタ処理するのは、django rest frameworkとdjango-filters(http://django-filter.readthedocs.io/en/master/)を使用しています。 11分の27 1/12日付フィールド内の特定の日付範囲で誕生日をフィルタリングする

へ:

最大の問題は、ユーザがこのような時間帯を選択した場合ジャンゴ共通のフィルタを使用すると、私は、問題が発生した

class birthdayFilter(django_filters.rest_framework.FilterSet): 
    day = django_filters.RangeFilter(name="born_date__day") 
    month = django_filters.RangeFilter(name="born_date__month") 

class Meta: 
    Model = User 
    fields = ['day','month'] 

ような何かをする必要があるだろうということです

この場合、デフォルトでは、27日以上1日未満の日付を取得しようとするため、空のサーバー応答が常に表示されます。これは常に無効です。 1/12

に 1/01に10分の27または10分の27私は解決策は、私の手が汚れて取得し、自分自身のフィルタを書くことだと思う、ユーザのようなものを選択した場合

もう一つの問題は、 djangoフィルタのドキュメントでは、それを行う方法については明確ではありません。

+0

あなたのモデル構造はどうか分かりません。 1つのDateFieldに何が問題なのか、それから簡単なdjangoクエリがあるのです。 –

答えて

0

ちょうどそれを行った、完全にテストされていないが、それはOKであるようだ。私はちょうどその期間が "dd/mm-dd/mm"として渡されると考えていました

def BirthdayFilter(queryset,name,value): 

if not value: 
    return queryset 

#considering value will be : xx/xx-xx/xx 
dateBegin,dateEnd = value.split('-') #first split the Date Range 
dayBegin,monthBegin = dateBegin.split('/') 
dayBegin = int(dayBegin) 
monthBegin = int(monthBegin) 
dayEnd,monthEnd = dateEnd.split('/') 
dayEnd = int(dayEnd) 
monthEnd = int(monthEnd) 

result = [] 

if monthEnd-monthBegin == 0: #dates at the same month, ok easy 
    if dayBegin > dayEnd:#not allowed 
     return result 
    result = queryset.filter(data_nascimento__day__range = (dayBegin,dayEnd),data_nascimento__month = monthBegin) 
elif abs(monthEnd - monthBegin) > 0: #crossing month 
    #first the edges 
    edgeStart = queryset.filter(data_nascimento__day__range = (dayBegin,31), data_nascimento__month = monthBegin) 
    edgeEnd = queryset.filter(data_nascimento__day__range = (1,dayEnd), data_nascimento__month = monthEnd) 
    result = edgeStart | edgeEnd 

    if abs(monthEnd - monthBegin) > 1: #if it is bigger than 1, we have to add 
     #months in between 
     monthsInBetween = [] 
     if monthBegin > monthEnd: #calendar crossing years 
      monthsInBetween = queryset.filter(data_nascimento__month__range = (monthBegin,12)) + Clientes.objects.filter(data_nascimento__month__range = (1,monthEnd)) 
     else: 
      monthsInBetween = queryset.filter(data_nascimento__month__range = (monthBegin,monthEnd)) 
     result = result | monthsInBetween 


class UserFilter(django_filters.rest_framework.FilterSet): 
    birthday = django_filters.CharFilter(method = BirthdayFilter) 

    class Meta: 
     Model = User 
     fields = ['birthday']