Py学习  »  Django

如何为模型中的日期字段创建月/年的django筛选器自定义筛选器?

rishi • 6 年前 • 927 次点击  

我正在尝试根据日期的月份和年份筛选日期。下面是我试过的。在模型中

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')

在VIEW中

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

当我试着打 http://127.0.0.1:8000/expense/?date__year=2019 我得到一个空结果。对此,我们将非常感谢您的帮助。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/40807
文章 [ 2 ]  |  最新文章 6 年前
rishi
Reply   •   1 楼
rishi    7 年前
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

类ExpenseDateFilter(FilterSet): date=customdatefilter(字段_name='date')

class Meta:
    model = Expense
    fields = ('project__id', 'date')
schillingt
Reply   •   2 楼
schillingt    7 年前

你考虑过用 DateRangeFilter ?对你来说也许是个更好的选择。但你的提议 ExpenseFilter 将查找所有年份中一个月的费用实例。