9

请帮助我理解这一点:

在 v1.6.6 上,它位于第 2744 行google/appengine/ext/db/__init__.py

class UnindexedProperty(Property):
  """A property that isn't indexed by either built-in or composite indices.

  TextProperty and BlobProperty derive from this class.
  """
  def __init__(self, *args, **kwds):
    """Construct property. See the Property class for details.

    Raises:
      ConfigurationError if indexed=True.
    """
    self._require_parameter(kwds, 'indexed', False)



    kwds['indexed'] = True
    super(UnindexedProperty, self).__init__(*args, **kwds)
 .
 .
 .

在他们将索引参数限制为 False 之后 - 他们将其设置为 True!

4

1 回答 1

4

在 1.2.2 之前,您可以对任何属性类型进行过滤查询,甚至是 Text 和 Blob。他们确实只返回了空列表,但它确实有效。版本 1.2.2 引入了indexed属性的属性,允许您禁用选定属性的索引 [1]。从那时起,您要查询的属性必须被索引,否则将引发异常。

我们知道 Text 和 Blob 属性不能被索引。在不改变任何其他内容的情况下,对这些属性的查询将从 1.2.2 开始引发异常(以前没有)。为了不引入回归并破坏现有应用程序,该行kwds['indexed'] = True被添加到UnindexedProperty类中。

如果我们可以控制所有依赖的代码,那么开始引发异常将是一个更简洁的解决方案。但鉴于不破坏现有应用程序,决定对其进行修补。

您可以通过更改kwds['indexed'] = Truekwds['indexed'] = False并运行以下代码段来自己尝试:

from google.appengine.ext import db

class TestModel(db.Model):
  text = db.TextProperty()

TestModel(text='foo').put()
print TestModel.all().filter('text =', 'foo').fetch(10)

[1] http://code.google.com/p/googleappengine/source/browse/trunk/python/RELEASE_NOTES#1165

于 2012-07-03T16:46:31.870 回答