App Engine Unindexed属性包含奇怪的代码

时间:2012-06-04 15:40:36

标签: python google-app-engine

请帮助我理解这一点:

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

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!

1 个答案:

答案 0 :(得分:4)

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

我们知道Text和Blob属性无法编入索引。不改变任何其他内容,对这些属性的查询将引发1.2.2的异常(他们之前没有)。为了不引入回归并破坏现有应用,行kwds['indexed'] = True已添加到UnindexedProperty类。

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

您可以自行尝试将kwds['indexed'] = True更改为kwds['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