在 Flask-Admin 中按星期几过滤
Filter by Day of Week in Flask-Admin
数据库模型是
class DoctorWaitTimes(db.Model):
__tablename__ = 'doctorwaittimes'
id = db.Column(db.Integer, primary_key=True)
datetime = db.Column(db.DateTime)
waittime = db.Column(db.Integer)
然后在模型视图中Class
column_filters = ['datetime']
这允许用户 select
- 等于
- 不等于
- 大于
- 小于
- 之间
- 不在
之间
- 空
并显示一个可点击的日历以便于输入 dates/times。这是完美的,但是我想做两个改变。
我想删除以下选项:
- 不等于
- 大于
- 小于
- 不在
之间
- 空
但我在文档中找不到任何内容。其次,我希望能够按星期几进行过滤。例如,它只会在每个星期二显示。
column_filters = [
FilterTerminal(
DoctorWaitTimes.datetime, 'Day of Week',
options=(('1', 'Monday'), ('2', 'Tuesday'))
), 'datetime'
]
但是,我不确定如何让实际的过滤器工作。在 MySQL 你可以 运行
SELECT * FROM doctorwaittimes WHERE AND DAYOFWEEK(datetime) = 1;
到 select 星期一,但我不确定如何使用数据库模型来完成。
要从您的视图中删除多种类型的过滤器,请使用 FilterConverter class。它有几个适用于每种类型列的过滤器列表。 Subclass 它并替换这些列表以删除不需要的过滤器。将新的 class 指定为视图的 filter_converter
属性:
from flask_admin.contrib.sqla import ModelView, filters
class DoctorFilterConverter(filters.FilterConverter):
datetime_filters = (
filters.DateTimeEqualFilter,
filters.DateTimeBetweenFilter
)
class DoctorView(ModelView):
filter_converter = DoctorFilterConverter()
column_filters = ['datetime']
您可以使用相同的方式添加新的过滤器。星期几过滤器可以这样实现:
class DayOfWeekFilter(filters.BaseSQLAFilter):
def __init__(self, column, name, options=None, data_type=None):
options = (
('1', filters.lazy_gettext(u'Monday')),
('2', filters.lazy_gettext(u'Tuesday')),
('3', filters.lazy_gettext(u'Wednesday')),
('4', filters.lazy_gettext(u'Thursday')),
('5', filters.lazy_gettext(u'Friday')),
('6', filters.lazy_gettext(u'Saturday')),
('7', filters.lazy_gettext(u'Sunday'))
)
super(DayOfWeekFilter, self).__init__(column, name, options, data_type)
def operation(self):
return filters.lazy_gettext('day of week')
def validate(self, value):
return value in ('1', '2', '3', '4', '5', '6', '7')
def apply(self, query, value, alias=None):
return query.filter(db.func.extract('dow', self.get_column(alias)) == value)
那你可以把它加到datetime_filters
:
class DoctorFilterConverter(filters.FilterConverter):
datetime_filters = (
filters.DateTimeEqualFilter,
filters.DateTimeBetweenFilter,
DayOfWeekFilter
)
请注意,没有通用的 SQL 函数来提取星期几。我使用了 PostgreSQL EXTRACT function. In MySQL you can try to use WEEKDAY 函数:
def apply(self, query, value, alias=None):
return query.filter(db.func.weekday(self.get_column(alias)) == value)
并且您需要将选项的编号更改为 WEEKDAY 函数 returns 0 表示星期一,6 表示星期日。
数据库模型是
class DoctorWaitTimes(db.Model):
__tablename__ = 'doctorwaittimes'
id = db.Column(db.Integer, primary_key=True)
datetime = db.Column(db.DateTime)
waittime = db.Column(db.Integer)
然后在模型视图中Class
column_filters = ['datetime']
这允许用户 select
- 等于
- 不等于
- 大于
- 小于
- 之间
- 不在 之间
- 空
并显示一个可点击的日历以便于输入 dates/times。这是完美的,但是我想做两个改变。
我想删除以下选项:
- 不等于
- 大于
- 小于
- 不在 之间
- 空
但我在文档中找不到任何内容。其次,我希望能够按星期几进行过滤。例如,它只会在每个星期二显示。
column_filters = [
FilterTerminal(
DoctorWaitTimes.datetime, 'Day of Week',
options=(('1', 'Monday'), ('2', 'Tuesday'))
), 'datetime'
]
但是,我不确定如何让实际的过滤器工作。在 MySQL 你可以 运行
SELECT * FROM doctorwaittimes WHERE AND DAYOFWEEK(datetime) = 1;
到 select 星期一,但我不确定如何使用数据库模型来完成。
要从您的视图中删除多种类型的过滤器,请使用 FilterConverter class。它有几个适用于每种类型列的过滤器列表。 Subclass 它并替换这些列表以删除不需要的过滤器。将新的 class 指定为视图的 filter_converter
属性:
from flask_admin.contrib.sqla import ModelView, filters
class DoctorFilterConverter(filters.FilterConverter):
datetime_filters = (
filters.DateTimeEqualFilter,
filters.DateTimeBetweenFilter
)
class DoctorView(ModelView):
filter_converter = DoctorFilterConverter()
column_filters = ['datetime']
您可以使用相同的方式添加新的过滤器。星期几过滤器可以这样实现:
class DayOfWeekFilter(filters.BaseSQLAFilter):
def __init__(self, column, name, options=None, data_type=None):
options = (
('1', filters.lazy_gettext(u'Monday')),
('2', filters.lazy_gettext(u'Tuesday')),
('3', filters.lazy_gettext(u'Wednesday')),
('4', filters.lazy_gettext(u'Thursday')),
('5', filters.lazy_gettext(u'Friday')),
('6', filters.lazy_gettext(u'Saturday')),
('7', filters.lazy_gettext(u'Sunday'))
)
super(DayOfWeekFilter, self).__init__(column, name, options, data_type)
def operation(self):
return filters.lazy_gettext('day of week')
def validate(self, value):
return value in ('1', '2', '3', '4', '5', '6', '7')
def apply(self, query, value, alias=None):
return query.filter(db.func.extract('dow', self.get_column(alias)) == value)
那你可以把它加到datetime_filters
:
class DoctorFilterConverter(filters.FilterConverter):
datetime_filters = (
filters.DateTimeEqualFilter,
filters.DateTimeBetweenFilter,
DayOfWeekFilter
)
请注意,没有通用的 SQL 函数来提取星期几。我使用了 PostgreSQL EXTRACT function. In MySQL you can try to use WEEKDAY 函数:
def apply(self, query, value, alias=None):
return query.filter(db.func.weekday(self.get_column(alias)) == value)
并且您需要将选项的编号更改为 WEEKDAY 函数 returns 0 表示星期一,6 表示星期日。