【发布时间】:2020-04-21 14:33:08
【问题描述】:
我正在创建一个 sqlalchemy 过滤器,用于查找特定时间范围之间的行,但我只希望在它们具有当天的值时应用此过滤器。如果他们不这样做,他们也应该被退回。过滤器如下所示:
models = {
CheckinAction: Student.person_id == CheckinAction.person_id,
CheckinTimeRange: CheckinAction.chk_checkin_time_range_id == CheckinTimeRange.pk,
}
return join_models(query, models, "outerjoin").filter(
CheckinTimeRange.day >= pendulum.parse(start_day).date(), CheckinTimeRange.day <= pendulum.parse(end_day).date()
)
在上面的代码中,CheckinAction 和 CheckinTimeRange 模型外连接到现有的 Student 查询。如果他们有签入操作,我只想应用 CheckinTimeRange.day 过滤器。一个例子是:
row #1: {
student_id = 1,
student_name = 'row_to_not_filter',
checkin_action = None,
checkin_time_range = None
}
row #2: {
student_id = 2,
student_name = 'row_to_filter',
checkin_action = some_object,
checkin_time_range = {day = '2020-04-21'}
}
我只想将过滤器应用于第二行,因为它们有一个 checkin_time_range。
【问题讨论】:
-
“没有 ...day 值”是指他们的日期为 NULL?
-
是的。此过滤器位于对 CheckinTimeRange 执行外连接的较大查询上。 fitler 正在过滤出他们在 checkinTimeRange 中为 NULL 的位置,但我想返回所有内容。基本上只希望在有 timeRange 的情况下应用过滤器。
-
这是重要信息,请编辑问题以包含该事实和更好的查询示例。原因是在这种情况下,您可以考虑将谓词移动到连接的 ON 子句。
-
当然!我更新了问题,这样更有意义吗?
标签: python sqlalchemy