2017-09-13 16 views
0

私はdatetimeから抽出された日付を使用してQuerySetをフィルタリングする方法を理解しようとしています。datetimeフィールドでgte、lte dateをフィルタリングする方法は?

私はDjango-filterを使用しており、非常に効果のないQuerySetを反復処理することなくそのようなルックアップを構成することはできません。

私はを試しましたが動作しません。

class MyReservationsFilter(FilterSet): 
    datetime__lte = DateFilter(method='datetime_filter',name='lte') 
    class Meta: 
     model = Reservation 
     fields = {'status': ['exact'], 
        # 'datetime': ['lte', 'gte'], 
        'destination_from': ['exact'], 
        'destination_to': ['exact'],} 


    def datetime_filter(self, queryset, name, value): 

     lookup = 'datetime__'+name 
     return queryset.filter(**{lookup:value}) 

あなたは何をすべきか知っていますか?

ので、私はdatetime__lte/gteを使用することはできません:私はReservationオブジェクトrを持って

>> r.datetime 
>> datetime.datetime(2017, 8, 31, 17, 55) 
>> r.datetime.date() 
>> datetime.date(2017, 8, 31) 

だから今は、日付に基づいてフィルタリングしてみてください:

Reservation.objects.filter(datetime__lte=datetime.date(2017, 8, 31),datetime__gte=datetime.date(2017, 8, 31)) 

>> [] 

、それはあまりにも日付ではなく、時間だけを見ていないためです。だから私は適切にフィルタリングできるように日付を抽出する必要があります。

答えて

1

datetimeフィールドの日付部分のみを比較する場合は、date変換を使用する必要があります。例えば、

Reservation.objects.filter(datetime__date__lte=date(2017, 1, 1)) 

これはFilterSet秒で動作するように取得するのカスタムメソッドを必要としません。フィルタ式は、フィルタコンストラクタの引数namelookup_exprを結合することで構築されます。 name引数はモデルフィールド名に対応する必要があり、lookup_exprは変換およびルックアップタイプを考慮する必要があります。あなたがDjangoの1.9を使用している場合は、これは私が知ってあまりにも多くのタイピングでこの

Model.objects.filter(post_date__year=date.year, 
        post_date__month=date.month, 
        post_date__day=date.day) 

のようにフィルタリングすることができない場合

class MyReservationsFilter(FilterSet): 
    datetime__lte = DateFilter(name='datetime', lookup_expr='date__lte') 

    class Meta: 
     model = Reservation 
関連する問題