appengine: ReferencePropertyResolveError: не удалось разрешить ReferenceProperty: [u'User ', xxxxxxxxxxxxx] - PullRequest
0 голосов
/ 10 февраля 2020

У меня есть код для выбора участников и их отображения. Логи 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

1 Ответ

1 голос
/ 19 февраля 2020

Разбейте строку 301 вашего кода на a для l oop и добавьте блок try / исключением вокруг строки с помощью join.user

...