2012-06-04 10 views
9

が含まれています私はこの理解して助けてください:それはgoogle/appengine/ext/db/__init__.pyのライン2744にだv1.6.6でApp EngineのUnindexedPropertyは奇妙なコード

を:

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) 
. 
. 
. 

、彼らが偽であることをインデックス付きパラメータを制約した後 - 彼らはそれを設定します本当に!

+0

は恵みに感謝を@kamens。 +500この質問は恐らくあなたにはおそらく本当に気になりました:) – theosp

+0

私は賞金を提供してくれました... – kamens

答えて

4

1.2.2より前のバージョンでは、テキストとBlobを含むすべてのプロパティタイプに対してフィルタクエリを実行できます。彼らは空リストを返すだけでしたが、うまくいきました。バージョン1.2.2では、プロパティの[indexed]属性が導入されており、選択したプロパティのインデックスを無効にすることができます[1]。それ以来、照会したいプロパティは索引を付ける必要があります。そうしないと、例外がスローされます。

TextとBlobのプロパティはインデックスできません。他のものを変更していない場合、それらのプロパティに対するクエリは1.2.2からの例外を発生させるでしょう(前にはなかった)。回帰を導入せずに既存のアプリケーションを破棄するには、kwds['indexed'] = Trueという行をUnindexedPropertyクラスに追加しました。

すべての依存コードを制御できれば、例外を発生させるより洗練されたソリューションでした。しかし、既存のアプリを破壊しないという観点から、パッチを適用することに決めました。

あなたはkwds['indexed'] = Falsekwds['indexed'] = Trueを変更することにより、それを自分で試してみて、このスニペットを実行することができます。

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

+0

意味があります、興味深い – kamens

+0

UnindexedPropertyは単にコードが 'indexed = True '(非テキスト/ Blob)プロパティにインデックスを構築するでしょうか? –

+0

(@ alpertの記述と一致する例は、aetycoonのArrayPropertyです:https://github.com/Arachnid/aetycoon/blob/master/__init__.py) – kamens