У меня есть код для выбора участников и их отображения. Логи c, управляющие представлением, приведены ниже:
def fetch_participants(self, count=12):
memcache_key = 'mission_participants:%d:%d' % (self.key().id(), count)
participants = utils.deserialize_entities(memcache.get(memcache_key))
if participants is None:
participants = self.fetch_participants_datastore(count)
memcache.set(memcache_key, utils.serialize_entities(participants), 3600)
return participants
Проблема в том, что appengine выдает следующую ошибку:
File "site/templates/participant_base.html", line 209, in block "content"
{% set participants = mission.fetch_participants(40) %}
File "/base/data/home/apps/proj/32.424491487021355902/models/mission.py", line 311, in fetch_participants
participants = self.fetch_participants_datastore(count)
File "/base/data/home/apps/proj/32.424491487021355902/models/mission.py", line 301, in fetch_participants_datastore
users = [join.user for join in joins]
File "/base/alloc/tmpfs/dynamic_runtimes/python27g/9fae800fb98bd45d/python27/python27_lib/versions/1/google/appengine/ext/db/__init__.py", line 3734, in __get__
reference_id.to_path())
ReferencePropertyResolveError: ReferenceProperty failed to be resolved: [u'User', xxxxxxxxxxx]
Похоже, что эта строка выглядит так:
participants = self.fetch_participants_datastore(count)
Пользователь в стеке переполнения задал аналогичный вопрос:
{ ссылка }
Это происходит, когда вы пытаетесь разрешить Ссылочное свойство (путем разыменования его - например, (MyModel.MyReferenceProp.foo), а свойство, на которое ссылаются, больше не существует - потому что оно было удалено.
Вам нужно изменить код, чтобы перехватить это исключение, когда вы разыменовываете сущность, которая могла быть удалена, и обрабатываете ее соответствующим образом.
Я думаю, мне нужно сделать что-то подобное, проблема в том, что я не знаю, как изменить код, чтобы перехватить исключение. Можно ли отфильтровать участников, чтобы они не включали упомянутых участников? Есть ли лучшая альтернатива?
def fetch_participants_datastore(self, count=12):
joins = self.mission_joins.order('-created').fetch(count * 2)
utils.prefetch_refprops(joins, MissionJoin.user)
users = [join.user for join in joins]
with_avatars = [user for user in users if user.has_avatar()]
without_avatars = [user for user in users if not user.has_avatar()]
users = with_avatars + without_avatars
return users[:count]
Редактировать:
for join in joins:
try:
users = join.user
except:
pass