gpt4 book ai didi

python - 在 Flask-Admin 中按星期几过滤

转载 作者:太空宇宙 更新时间:2023-11-03 15:33:16 25 4
gpt4 key购买 nike

数据库模型是

class DoctorWaitTimes(db.Model):
__tablename__ = 'doctorwaittimes'

id = db.Column(db.Integer, primary_key=True)
datetime = db.Column(db.DateTime)
waittime = db.Column(db.Integer)

然后在ModelView类中

column_filters = ['datetime']

这允许用户选择

  • 等于
  • 不等于
  • 大于
  • 小于
  • 之间
  • 不在之间

并显示可点击的日历,以便于输入日期/时间。这是完美的,但我想做两点改变。

我想删除以下选项:

  • 不等于
  • 大于
  • 小于
  • 不在之间

但我在文档中找不到任何内容。其次,我希望能够按一周中的某一天进行过滤。例如,它只会在每周二显示。

column_filters = [
FilterTerminal(
DoctorWaitTimes.datetime, 'Day of Week',
options=(('1', 'Monday'), ('2', 'Tuesday'))
), 'datetime'
]

但是,我不确定如何让实际的过滤器发挥作用。在 MySQL 中你可以运行

SELECT * FROM doctorwaittimes WHERE AND DAYOFWEEK(datetime) = 1; 

选择星期一,但我不知道如何使用数据库模型来做到这一点。

最佳答案

要从 View 中删除多种类型的过滤器,请使用 FilterConverter类(class)。它有几个适用于每种类型的列的过滤器列表。对其进行子类化并替换这些列表以删除不需要的过滤器。将新类指定为 View 的 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功能。在MySQL中你可以尝试使用WEEKDAY功能:

def apply(self, query, value, alias=None):
return query.filter(db.func.weekday(self.get_column(alias)) == value)

您需要更改选项的计数,因为 WEEKDAY 函数返回 0 表示星期一,6 表示星期日。

关于python - 在 Flask-Admin 中按星期几过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42741987/

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