我有一个有create_date,update_date,release_date DateTimeField的模型。
我希望有过滤器来过滤这些DateTimeField与DateFilter。有一种方法我可以做到:
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就像:
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。
发布于 2020-12-04 17:29:46
您可以定义一个设置属性的类方法。但是你必须在某个地方叫它,例如,在它的定义之后。
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()https://stackoverflow.com/questions/65034807
复制相似问题