ReferenceProperty failed to be resolved

app-engine-patchのadmin画面にアクセスするとこういうエラーが出るので

  File "/.../admin/templatetags/admin_list.py", line 179, in items_for_result
    field_val = getattr(result, f.attname)
  File "/base/python_lib/versions/1/google/appengine/ext/db/__init__.py", line 2759, in __get__
    raise Error('ReferenceProperty failed to be resolved')
Error: ReferenceProperty failed to be resolved

admin.pyをこう書き換えてみたらエラーにならないで表示されるようになった。

class PlayerAdmin(admin.ModelAdmin):
#    list_display = (
#        'user_pref', 'name', 'desc', 
#        'type', 'api_key', 'entrypoint')
    list_display = ('name', )

手動で削除とかしたせいでリファレンスが適切な状態になっていないアイテムがあるんだろうなぁ。ReferencePropertyなのはuser_prefだけなのでこれが正しくない状態になっているんだろう。Data Viewerで眺めてみたけど全部キーが入っていたので「キーが入っているのでそのキーで値を取得しようとしたらもうなくなってた!」ってことなんだろうな。


user_prefがNoneだったらわかるようにいじってみた

class Player(db.Model):
    def __unicode__(self):
        prefix = u"DEBUG" + unicode(self.user_pref) + u":"
        (略)

あー、admin画面と無関係にそもそもself.user_prefを参照できない状態になっている。そりゃそうか。

  File "/base/data/home/apps/nishiotools/1.336230617341987572/saichugen/models.py", line 146, in __unicode__
    prefix = u"DEBUG" + unicode(self.user_pref) + u":"
  File "/base/python_lib/versions/1/google/appengine/ext/db/__init__.py", line 2759, in __get__
    raise Error('ReferenceProperty failed to be resolved')

じゃあ、参照できなかった時にはkey().name()を表示してもらおう。

    def __unicode__(self):
        try:
            prefix = u"DEBUG" + unicode(self.user_pref) + u":"
        except:
            return u"RESOLVE_ERROR:" + self.key().name()

結果:

DEBUGにしお:Desc@にしお 
RESOLVE_ERROR:player_1d3ab0f82dbaa65af3b6146316da7da9 
DEBUGにしお:Active@にしお 
RESOLVE_ERROR:player_7e8dc6ac2aff15513637896105ca7cb1 
DEBUGにしお:さんぷる@にしお 

ふむふむ。該当のアイテムを見てみると名前もdescも空っぽだ。作成された日時を記録するようにしておけばよかったなぁ。たぶん初期の頃に僕がいじっていた時の残骸だと思うけど判断材料がない。まあ、削除するか。