GAE DataStore готов загрузки в Python API

1

У меня есть две модели по отношению друг к другу:

class Question (db.Model):

questionText = db.StringProperty(многострочный = False)

class Answer (db.Model):

answerText = db.StringProperty(многострочный = False)

     

question = db.ReferenceProperty(Question, collection_name = 'answers')

У меня есть интерфейс, реализованный в Flex и использующий pyamf для загрузки данных.

Когда я пытаюсь загрузить все ответы со связанными вопросами, все работает по желанию, и я могу получить доступ поле

answer.question

однако в случае загрузки вопросов (например, Question.all()), `question.answers 'остается пустым /null

(хотя на стороне сервера /python я могу пересмотреть question.answers без проблем - возможно, после ленивой загрузки).

Так можно ли загружать все вопросы вместе с ответами?

(Я знаю, что это возможно в JPA Java api, но как насчет python?)

Shoud Я использую дополнительные настройки, GQL-запрос или фреймворк django, чтобы заставить его работать?

Теги:
google-app-engine
google-cloud-datastore
eager-loading
pyamf

1 ответ

1
Лучший ответ

По умолчанию PyAMF не будет кодировать поля ReferenceProperty, если они уже не были специально загружены методом службы. Это специально, поэтому вы не кодируете больше, чем вам нужно.

PyAMF ищет специальный атрибут класса __amf__, который он использует для настройки процесса кодирования и декодирования для экземпляров этого типа. Более подробную информацию можно найти в docs.

Итак, чтобы заставить кодировать все ответы по всем вопросам, которые вы должны сделать:

class Question(db.Model):
    class __amf__:
        static = ('answers',)

    questionText = db.StringProperty(multiline=False)

class Answer(db.Model):
    answertText = db.StringProperty(multiline=False)
    question = db.ReferenceProperty(Question, collection_name='answers')

Установка статического атрибута гарантирует, что каждый экземпляр Question имеет набор атрибутов answers (через getattr), который, в свою очередь, потребует поиска хранилища данных.

Важно, чтобы этот параметр не был широко распространен, поэтому любой вопрос будет иметь атрибут ответов, как он появляется на экземпляре.

  • 0
    Отлично, это работает, но я получаю 'aswers' как тип Array во Flex. Есть ли способ получить aswers как ArrayCollection. Должен ли я реализовать метод readamf или, возможно, существует более простое решение? Если единственный способ - это метод readamf, как он должен выглядеть? Спасибо заранее
  • 1
    В версиях PyAMF <= 0.5.1 вы должны сделать это вручную или установить pyamf.amf3.use_proxy_default = True. Это было исправлено в [следующей версии] 0.6 .. вы можете сделать: class Question (db.Model): class amf : static = ('answers',) proxy = ('answers',) Вы можете использовать IExternalizable, но тогда вам нужно будет обработать кодирование / декодирование всего экземпляра Вопроса на стороне Python и ActionScript. Я бы не рекомендовал использовать эту функцию для этого варианта использования.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню