首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在django-过滤器中带有DateFilter的Fitler DateFilter

在django-过滤器中带有DateFilter的Fitler DateFilter
EN

Stack Overflow用户
提问于 2020-11-27 09:21:47
回答 1查看 369关注 0票数 3

我有一个有create_dateupdate_daterelease_date DateTimeField的模型。

我希望有过滤器来过滤这些DateTimeFieldDateFilter。有一种方法我可以做到:

代码语言:javascript
复制
class ProductFilter(django_filters.FilterSet):
    
    create_date = DateFilter(field_name='create_date', lookup_expr='date')
    create_date__gt = DateFilter(field_name='create_date', lookup_expr='date__gt')
    create_date__lt = DateFilter(field_name='create_date', lookup_expr='date__lt')
    create_date__gte = DateFilter(field_name='create_date', lookup_expr='date__gte')
    create_date__lte = DateFilter(field_name='create_date', lookup_expr='date__lte')
    
    update_date = DateFilter(field_name='update_date', lookup_expr='date')
    update_date__gt = DateFilter(field_name='update_date', lookup_expr='date__gt')
    update_date__lt = DateFilter(field_name='update_date', lookup_expr='date__lt')
    update_date__gte = DateFilter(field_name='update_date', lookup_expr='date__gte')
    update_date__lte = DateFilter(field_name='update_date', lookup_expr='date__lte')

    release_date = DateFilter(field_name='release_date', lookup_expr='date')
    release_date__gt = DateFilter(field_name='release_date', lookup_expr='date__gt')
    release_date__lt = DateFilter(field_name='release_date', lookup_expr='date__lt')
    release_date__gte = DateFilter(field_name='release_date', lookup_expr='date__gte')
    release_date__lte = DateFilter(field_name='release_date', lookup_expr='date__lte')

你可能会发现事情是重复的。有什么方法来封装逻辑吗?

我知道我可以用Meta.fields就像:

代码语言:javascript
复制
class ProductFilter(django_filters.FilterSet):
    class Meta:
        model = Product
        fields = {
            'create_date': ['date', 'date__gt', 'date__lt', 'date__gte', 'date__lte'],
            'update_date': ['date', 'date__gt', 'date__lt', 'date__gte', 'date__lte'],
            'release_date': ['date', 'date__gt', 'date__lt', 'date__gte', 'date__lte'],
        }

但是过滤器名称将变成create_date__date而不是create_date

EN

回答 1

Stack Overflow用户

发布于 2020-12-04 17:29:46

您可以定义一个设置属性的类方法。但是你必须在某个地方叫它,例如,在它的定义之后。

代码语言:javascript
复制
class ProductFilter(django_filters.FilterSet):
    @classmethod
    def init_attr(klass):
        field_names = ["create_date", "update_date", "release_date"]
        lookup_expr = ["", "__gt", "__lt", "__gte", "__lte"]
        
        for field_name in field_names:
            for expr in lookup_expr:
                setattr(klass, field_name+expr, DateFilter(field_name=field_name, lookup_expr='date'+expr))
PoductFilter.init_attr()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65034807

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档