Как создать пользовательский фильтр django-фильтра для месяца / года для поля dateField в модели? - PullRequest
0 голосов
/ 22 января 2019

Я пытаюсь отфильтровать дату по месяцу и году. Ниже я попробовал. В models.py

class Expense(TimeStampedModel):date = models.DateField(_('date')

в serailizer.py

class ExpenseSerializer(serializers.ModelSerializer):
    class Meta:
        model = Expense
        fields = '__all__'

в filters.py

class ExpenseFilter(django_filters.FilterSet):
    date__month = django_filters.DateFilter(field_name='date',                  
    lookup_expr='month')
    date__year = django_filters.DateFilter(field_name='date', lookup_expr='year')
    class Meta:
        model = Expense
        fields = ('date__month', 'date__year')

В views.py

class ExpenseViewSet(viewsets.ModelViewSet):
    queryset = Expense.objects.all()
    serializer_class = ExpenseSerializer
    filter_class = ExpenseFilter

Когда я пытаюсь нажать http://127.0.0.1:8000/expense/?date__year=2019, я получаю пустой результат. Любая помощь в этом будет очень признательна.

Ответы [ 2 ]

0 голосов
/ 28 января 2019
class CustomDateFilter(DateFilter):
def filter(self, qs, value):
    if value:
        filter_lookups = {
            "%s__month" % (self.field_name, ): value.month,
            "%s__year" % (self.field_name, ): value.year
        }
        qs = qs.filter(**filter_lookups)
    return qs

class ExpenseDateFilter (FilterSet): date = CustomDateFilter (field_name = 'date')

class Meta:
    model = Expense
    fields = ('project__id', 'date')
0 голосов
/ 23 января 2019

Рассматривали ли вы использование DateRangeFilter?Это может быть лучшим вариантом для вас.То, что он не будет делать, но ваш предложенный ExpenseFilter будет найти экземпляры расходов за один месяц всех лет.

...