Google App Engine模型家长

时间:2012-01-30 10:31:49

标签: python database google-app-engine model

我对谷歌应用引擎模型系统(以及所有相关的数据库模型)都不熟悉,我试图弄清楚如何让模型将模型实例集合作为其中一个属性。我觉得必须有一种更好的方法来模拟我拥有的数据。

所以这是一个例子。我正在写一个期刊webapp。我想允许用户拥有模型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模型的ID列表(如下所示)。

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)

在Journal模型中,我将JournalItem个实例的id列表存储为id的列表

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 个答案:

答案 0 :(得分:3)

这几乎就是这样做的,除了我会使用ListProperty(db.Key)而不是int。然后,一旦您拥有属于该用户的db.get(userjournals.journals)实例,您就可以Journals获取所有用户的日志(请注意,为避免混淆,您应该称之为UserJournals)。

请记住,GAE是一个非关系型数据存储区,有时您必须与使用SQL的方式略有不同。

答案 1 :(得分:1)

您可以按照guide进行操作,以优雅的方式描述如何在Google Appengine上建立实体关系模型。

您可以采取的相反方法是在JournalItem实体中创建一个Journal的引用,并为其分配一个collection_name。

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

您将能够以这种方式遍历Journal的JournalItems:

for item in journal.journal_items
  logging.info(item.content)