筛选器无效:每个查询只能有一个属性具有不等筛选器(>=,<=,>,<)

2024-09-27 04:23:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一些项目在某些时间段是可以预订的。网球场。因此,每个项目都有一些相关的可用性槽位,每个槽位由begintime和endtime定义。Begintime和endtime被定义为datetime对象,因此09.00-11.30之间的可用时隙存储为例如2013-12-13 09.00(Begintime)到2013-12-13 11.30(endtime)。在

当接到预订请求时,我需要确定网球场是否在所需的时间段内可用。在

因此,我尝试根据开始时间和结束时间筛选可用性时段,我的查询如下所示:

desired_availability_start = datetime(2013, 12, 13, 9,0,0)
desired_availability_end = datetime(2013, 12, 13, 10,0,0)
availability_slots = self.availability_slots.filter("begin <= ", desired_availability_start).filter("end >= ", desired_availability_end).fetch(limit=10)

但是我得到了以下错误

^{pr2}$

因为我试图同时过滤begin和end属性。在

根据输入和来自主题Inequality Filter in AppEngine DatastoreBadFilterError: invalid filter: Only one property per query may have inequality filters (<=, >=, <, >)的其他帖子,我当前的解决方案是首先在begin上过滤:

filtered_availability_slots = self.availability_slots.filter("begin <= ", desired_availability_start).fetch(limit=10)

然后过滤结束并将过滤后的项目附加到列表中:

final_availability_slots = []              
  for availability in filtered_availability_slots:         
      if availability.end >= desired_availability_end:  
        final_avaialability_slotes.append(availability)   

但这是实现我想要的最好的方法吗?在

我正在使用谷歌应用引擎和Python

感谢任何帮助

谢谢 托马斯


Tags: 项目datetime定义filterstartend时间段begin
3条回答

我有一个类似的要求:从数据存储区中选择应该立即呈现/交付的实体。由于数据存储无法处理此问题,因此需要应用程序逻辑。我对满足约束两端的键进行两个单独的查询,然后取它们的交集:

satisfies "begin" criteria: k1, k3, |k4, k5|, k6
                                +   +  
satisfies "end" criteria:       k2, |k4, k5|, k7, k8

“begin”和“end”的交集是键k4, k5。在

^{pr2}$

然后迭代这些键,得到我需要的实体:

for key in valid_dt_keys:
    foobar = FooBar.all().filter('__key__ =', key).get()
    ...

或者:

foobars = FooBar.all().filter('__key__ IN', valid_dt_keys)
for foobar in foobars:
    ...

你问的有点不清楚。你是否理解这个问题还不清楚:你试图使用两个不等式过滤器,但这是不允许的。做不到。在

您必须解决这个数据存储限制。在

最基本的选择就是你自己用暴力来强迫它。使用一个过滤器,自己手动过滤出结果。这可能有助于对begin进行筛选,并对end进行排序,但您必须仔细检查结果并选择所需的实际实体。在

calitem = [x for x in self.appointments.filter("begin >= ", start).filter("begin <= " end) if x.end <= end]

在大多数情况下,您需要重新构造数据,这样就不需要两个不等式过滤器。这可能是可能的,也可能是不可能的。在

我想猜猜你在做什么,但如果你想根据日历判断某人在上午11点是否很忙,一种方法是:

  1. 把一天分成时间段,而不是使用任意时间段,即15分钟的时间段。在
  2. 将事件存储为它使用的时间块列表。在
  3. 查询包含11am时间块的事件。在

正如我想您已经知道的,您不能在使用数据存储的不等式过滤器中使用多个变量。除非你真的需要,你可以只使用“开始”时间进行过滤,仍然可以得到相当准确的结果。在

calitem = self.appointments.filter("begin >= ", start).filter("begin <= ", end).fetch(limit=10)

如果您确实需要,使用应用程序逻辑,您只能显示不超过“end”值的项。我什么也看不到。在

相关问题 更多 >

    热门问题