URLは500文字を超えるがどうしよう

Google App Engineの話。URLはIEでさえ最長2083文字まで受け付けるので、500文字が上限のStringPropertyに入れるわけにはいかない。

class StringProperty(verbose_name=None, multiline=False, ...)
A short string property. Takes a Python str or unicode (basestring) value of 500 bytes or less.

じゃあTextPropertyに入れるか、というと今度はインデクスをはれないので「すでに追加済のURLだったら新しく追加しないで前のを使う」なんてのができない。(forで回すとか言わないように!)

class TextProperty()
A long string.
Unlike StringProperty, a TextProperty value can be more than 500 bytes long. However, TextProperty values are not indexed, and cannot be used in filters or sort orders.

どうしようかなぁ、URLを刻むかなぁ…、としばらく考えてたんだけど冷静に考えたらリストの中からURLが一致するアイテムがあるかどうかだけすぐにわかればいいわけなので、TextPropertyにURL本体を入れて、StringPropertyにハッシュ値を入れることにした。

class URL(db.model):
    url = db.TextProperty()
    hash = db.StringProperty()

    def set_value(self, s):
        self.url = s
        self.hash = hashlib.sha384(s).hexdigest()
        self.save()
        return self


追記。っ[LinkProperty]