gpt4 book ai didi

python - 在 django-filter 中使用日期过滤器过滤日期时间字段

转载 作者:行者123 更新时间:2023-12-04 15:12:07 25 4
gpt4 key购买 nike

我有一个模型,它有 create_dateupdate_daterelease_date DateTimeField。

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

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

最佳答案

您可以覆盖 FilterSet__init__(...) 方法strong> 分类为,

field_names = ["create_date", "update_date", "release_date"]
lookup_expr = ["gt", "lt", "gte", "lte"]
filter_dict = {}
for field_name in field_names:
filter_dict[field_name] = DateFilter(lookup_expr="date")
for expr in lookup_expr:
filter_dict[f"{field_name}_{expr}"] = DateFilter(
field_name=field_name,
lookup_expr=f"date__{expr}"
)


class FooFilter(filters.FilterSet):

def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
<b>self.filters.update(filter_dict)</b>

关于python - 在 django-filter 中使用日期过滤器过滤日期时间字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65034807/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com