首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >每周一天在瓶内过滤-管理

问每周一天在瓶内过滤-管理
EN

Stack Overflow用户
提问于 2017-03-11 23:37:52
回答 1查看 1.1K关注 0票数 1

DB模型是

代码语言:javascript
复制
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类中

代码语言:javascript
复制
column_filters = ['datetime']

这允许用户选择

  • 等于
  • 不等于
  • 大于
  • 小于
  • 在两者之间
  • 而不是介于
  • 空的

并显示一个可点击的日历,以便于日期/时间的输入。这是完美的,然而,有两个变化,我想作出。

我想删除以下选项:

  • 不等于
  • 大于
  • 小于
  • 而不是介于
  • 空的

但我在文件里什么都找不到。第二,我希望能在一周中的每一天进行过滤。因此,例如,它将只显示每周二。

代码语言:javascript
复制
column_filters = [
        FilterTerminal(
            DoctorWaitTimes.datetime, 'Day of Week', 
            options=(('1', 'Monday'), ('2', 'Tuesday'))
        ), 'datetime'
    ]

然而,我不知道如何使实际的过滤器工作。在MySQL中,您可以运行

代码语言:javascript
复制
SELECT * FROM doctorwaittimes WHERE AND DAYOFWEEK(datetime) = 1; 

选择星期一,但我不知道如何使用DB模型。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-13 12:42:46

要从视图中删除几种类型的筛选器,请使用FilterConverter类。它有几个过滤器列表适用于每种类型的列。将其子类化,并替换这些列表以删除不需要的筛选器。将新类指定为视图的filter_converter属性:

代码语言:javascript
复制
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']

您可以使用相同的方式添加新的筛选器。每周一天的过滤器可以以这样的方式实现:

代码语言:javascript
复制
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中。

代码语言:javascript
复制
class DoctorFilterConverter(filters.FilterConverter):
    datetime_filters = (
        filters.DateTimeEqualFilter,
        filters.DateTimeBetweenFilter,
        DayOfWeekFilter
    )

注意,没有通用的SQL函数来提取一周中的一天。我使用了PostgreSQL 提取函数。在MySQL中,您可以尝试使用平日函数:

代码语言:javascript
复制
def apply(self, query, value, alias=None):
    return query.filter(db.func.weekday(self.get_column(alias)) == value)

您需要更改选项的编号,因为工作日函数返回星期一为0,周日为6。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42741987

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档