【问题标题】:NDB query on computed property not evaluated correctly未正确评估计算属性的 NDB 查询
【发布时间】:2015-05-28 10:04:31
【问题描述】:

我遇到了一个奇怪的问题。我想我不是 replication issue 的情况,而是类似的情况。

我有这个具有计算属性的模型

   status = ndb.ComputedProperty(lambda self: self._compute_status())
...
    def _compute_status(self):
        if self.canceled:
            return "CANCELED"
        course = self.course.get().course_type
        if course == "SCHEDULED":
            now = datetime.now()
            if now < self.start_date:
                return "UPCOMING"
            elif now > self.end_date:
                return "FINISHED"
        return "ONGOING"

现在,我查询所有模型并进行这两个打印

print sessions[0]
print sessions[0].status

结果显示不同的值:

Session(key=Key('Session', 5302669702856704), canceled=False, course=Key('Course', 6605041225957376), created=datetime.datetime(2015, 5, 5, 13, 39, 56, 86329), day_no=None, end_date=datetime.datetime(2015, 5, 8, 9, 35), meta_data=None, name=u'asd', profile=None, session_type=u'JOINT', start_date=datetime.datetime(2015, 5, 7, 8, 50), status='UPCOMING', url=u'', week_no=None)
FINISHED

第一次打印是status=ONGOING,而第二次打印是FINISHED,因为end_date 在今天之后。

这对查询有影响,因为如果我查询status=='FINISHED',它不会返回正确的结果集。

有什么想法吗?

编辑:

实际上文档说:

注意:ComputedProperties 不是根据查询计算的,而是根据 放()。如果您更新模型的架构以包含 ComputedProperty, 您应该记住通过加载和写入来更新现有实体 它们到数据存储区。有关更多信息,请参阅更新模型的架构 信息。

但是,我该如何执行查询?我必须通过“手”过滤它们吗?

【问题讨论】:

    标签: python google-app-engine google-cloud-datastore app-engine-ndb


    【解决方案1】:

    您必须通过 datetime 属性进行查询,因为当您将此实体放入数据存储区时 - 该值是根据当前时间计算的,而当您查询它时 - 仍然使用旧值,但值正在获取当您触摸此属性时重新计算。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-20
      • 1970-01-01
      • 2018-02-12
      • 2018-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多