Сохранение сущностей в django-nonrel с помощью Google Appengine - PullRequest
6 голосов
/ 22 ноября 2011

Обновление: Я заметил, что объекты сохраняются (и доступны в средстве просмотра хранилища данных), когда я сохраняю их с помощью представлений (и функции create_object). Но когда я использую shell (manage.py shell) для создания и сохранения новой сущности, она не передается в хранилище (но все еще можно увидеть в Tes.objects.all ()).


Я начал играть с django-nonrel с google appengine, и меня раздражает такая простая вещь, как сохранение сущностей.

Я настроил свою среду, как описано в инструкции . Мне удалось запустить пример приложения, и он работает нормально. Я хотел бы расширить его, чтобы он сохранил мою сущность в хранилище. Для этого:

  1. Я добавил новый модуль django с models.py:

    from django.db import models
    
    class Tes(models.Model):
        name = models.CharField(max_length=150)
    
  2. Я создал скрипт для сохранения некоторых данных:

    import os
    import sys
    sys.path.append("d:\\workspace\\project\\")
    os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
    from testmodule.models import Tes
    t = Tes(name="test")
    t.save()    
    tes = Tes.objects.all()
    for t in tes:
        print t.name
    

Скрипт работает без ошибок. Когда я запускаю его несколько раз один за другим, он печатает все больше и больше «тестовых» строк. Но когда я пытаюсь запустить его после минутного перерыва, Tes.objects.all () ничего не возвращает. В течение этого времени файл хранилища данных меняет свой размер (но, возможно, это просто какие-то журналы). Когда я смотрю на http://localhost:8000/_ah/admin/datastore, я могу выбрать только AhAdminXrsfToken из поля выбора.

В любом случае, чего мне не хватает? Где я могу найти какие-то журналы, которые бы сказали мне, что не так?

Ответы [ 2 ]

4 голосов
/ 23 ноября 2011

Это гоча, которая вызывает много путаницы.Из djangoappengine docs :

Кроме того, никогда не запускайте manage.py runserver вместе с другими командами управления одновременно.Изменения не вступят в силу.Это ограничение App Engine SDK, которое может быть исправлено в более позднем выпуске.

Так что вы не можете выполнять manage.py runserver и manage.py shell одновременно.Если вы это сделаете, изменения в хранилище данных в одном не будут видны в другом.В локальном хранилище данных установлена ​​блокировка, поддерживаемая SDK App Engine.Убедитесь, что вы остановили сервер, прежде чем запускать оболочку.

0 голосов
/ 22 ноября 2011

Не будет ли t.put(), если вы создаете объект, а не сохраняете его? Я использую put(), чтобы создать сущность, и это работает для меня. И если вы импортируете django, вы можете знать, что есть альтернативы django, такие как мой выбор GAE + Jinja2 + WTForms, особенно теперь, когда google.db.djangoforms устарела, выбирая каркас форм для форм, движок шаблонов и, возможно, каркас db и вам не нужно импортировать django, что часто приводит к тому, что вы импортируете гораздо больше, чем вам нужно.

Поэтому я рекомендую избегать import django... и вместо этого использовать Jinja2 + WTForms. Если вы действительно хотите использовать django в движке приложений, вы можете проверить в проекте www.allbuttonspressed.com, который включает все django для движка приложений google, но будьте уверены, что вам нужно так много django, когда я подозреваю, что все, что нам нужно, это шаблонизатор и рамки формы, и мы можем обойтись без Django.

...