Родители модели Google App Engine - PullRequest
1 голос
/ 30 января 2012

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

Итак, вот пример. Я пишу журнал веб-приложение. Я хочу разрешить пользователям иметь несколько журналов, как определено моделью Journals

#Represents a collection of journals
class Journals(db.Model):
    user = db.UserProperty()
    journals = db.ListProperty(int)  #there has to be a better way of keeping track of journals then by a list of their id

В свойстве journals я храню список идентификаторов модели Journal (показано ниже).

class Journal(db.Model):
    user = db.UserProperty()
    name = db.StringProperty()
    date_created = db.DateTimeProperty(auto_now_add=True)
    last_modified = db.DateTimeProperty(auto_now=True)
    journal_item = db.ListProperty(int)

В модели журнала я храню список идентификаторов JournalItem в виде списка идентификаторов

class JournalItem(db.Model):
    user = db.UserProperty()
    name = db.StringProperty()
    date_created = db.DateTimeProperty(auto_now_add=True)
    last_modified = db.DateTimeProperty(auto_now=True)
    content = db.StringProperty(multiline=True)

Так что, я думаю, вопрос на самом деле заключается в том, как мне моделировать данные с этой структурой (я упустил некоторые свойства, чтобы упростить ее) (показано в json).

"Journals": {
    "Journal": {
        "user": "GAE user object",
        "name": "journal 1",
        "JournalItems": {
            "JournalItem": {
                "name": "entry 1",
                "content": "some example content"
            },
            "JournalItem": {
                "name": "entry 2",
                "content": "some example content"
            },
            "JournalItem": {
                "name": "entry n",
                "content": "some example content"
            }
        }
    }
    "Journal": {
        "user": "GAE user object",
        "name": "journal 2",
        "JournalItems": {
            "JournalItem": {
                "name": "entry 1",
                "content": "some example content"
            },
            "JournalItem": {
                "name": "entry 2",
                "content": "some example content"
            },
            "JournalItem": {
                "name": "entry n",
                "content": "some example content"
            }
        }
    }
}

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

Ответы [ 2 ]

3 голосов
/ 30 января 2012

Это в значительной степени способ сделать это, за исключением того, что я бы использовал ListProperty(db.Key) вместо int.Затем вы можете сделать db.get(userjournals.journals), чтобы получить все журналы пользователя, если у вас есть экземпляр Journals, принадлежащий этому пользователю (обратите внимание, что во избежание путаницы вам, вероятно, следует назвать это как UserJournals).Помните, что GAE - это нереляционное хранилище данных, и иногда вам приходится думать немного иначе, чем с использованием SQL.

1 голос
/ 31 января 2012

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

Обратный подход, который вы можете использовать, состоит в том, чтобы создать ссылку на пример журнала в сущности JournalItem и присвоить ей collection_name.

class JournalItem:
  Journal = db.ReferencePoperty(Journal, collection_name='journal_items')
  name = db....
  content = db...

Вы сможете перебирать JournalItems of Journal следующим образом:

for item in journal.journal_items
  logging.info(item.content)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...