Django (nonrel), механизм приложений и асинхронные вызовы базы - PullRequest
2 голосов
/ 26 сентября 2011

При использовании Google App Engine с Django-nonrel, есть ли какой-либо способ воспользоваться Async Datastore API , когда я объявляю свои классы моделей с помощью Django API?

Ответы [ 2 ]

3 голосов
/ 27 сентября 2011

Хорошо, я исследовал немного больше и нашел альтернативный способ иметь дело с моделью Django (т. Е. Все функции Django там) и по-прежнему иметь доступ к асинхронному API ...

В основном, используя хранилище данных напрямую:

from google.appengine.api import datastore

и у меня уже были методы для конвертации всех моих моделей в / из json dict, так что, в основном, нужно было выяснить, как Джанго-Нонрел делал это за кулисами:

Например:

Рассмотрение класса 'Project' с методами to_json и from_json (т. Е. Создание из словаря)

Для выполнения простого запроса (кажется, что Run () будет выполнять работу асинхронно, поэтому можно выполнить query.Run (), а затем запустить другой query.Run (), и оба будут работать одновременно):

query = datastore.Query(Project._meta.db_table)
for p in query.Run():
    p['id'] = c.key().id() #Convert from app engine key
    print Project.from_json(p)

Теперь, используя API для асинхронного получения объекта:

from djangoappengine.db.compiler import create_key
async = datastore.GetAsync(create_key(Project._meta.db_table, project_id))
p = async.get_result()
p['id'] = c.key().id() #Convert from app engine key
print Project.from_json(p)

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

1 голос
/ 26 сентября 2011

Нет. Инфраструктура Django предоставляет собственный интерфейс для хранилища данных, и пока она не поддерживает асинхронные вызовы напрямую, невозможно выполнять асинхронные вызовы.

...