Python 在烧瓶管理中按星期几过滤

Python 在烧瓶管理中按星期几过滤,python,flask-admin,Python,Flask Admin,DB模型是 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'] 这

DB模型是

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; 

选择Mondays,但我不知道如何使用DB Model来实现。

要从视图中删除几种类型的过滤器,请使用类。它有几个适用于每种列类型的筛选器列表。子类化它并替换这些列表以删除不需要的过滤器。将新类指定为视图的
filter\u 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\u过滤器中

class DoctorFilterConverter(filters.FilterConverter):
    datetime_filters = (
        filters.DateTimeEqualFilter,
        filters.DateTimeBetweenFilter,
        DayOfWeekFilter
    )
请注意,没有通用的SQL函数来提取星期几。我使用了PostgreSQL函数。在MySQL中,您可以尝试使用以下函数:

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

您还需要更改选项的计数,因为WEEKDAY函数周一返回0,周日返回6。

非常有效。谢谢你的帮助!