我对谷歌应用引擎模型系统(以及所有相关的数据库模型)都不熟悉,我试图弄清楚如何让模型将模型实例集合作为其中一个属性。我觉得必须有一种更好的方法来模拟我拥有的数据。
所以这是一个例子。我正在写一个期刊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"
}
}
}
}
我希望不要啰嗦烦人。任何有关此事的帮助将不胜感激。
答案 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)