我对谷歌应用程序引擎模型系统(以及所有数据库模型)有些陌生,我正试图弄清楚如何使模型具有模型实例集合作为属性之一。我觉得必须有一种更好的方法来对我所拥有的数据进行建模。
下面是一个例子。我正在写一个日记网络应用程序。我想允许用户拥有由模型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"
}
}
}
}
我希望这不是长篇大论。如能在此事上提供任何帮助,我们将不胜感激。
这基本上就是这样做的,只是我会使用ListProperty(db.Key)
而不是int。然后,一旦Journals
实例属于该用户,就可以使用db.get(userjournals.journals)
来获取该用户的所有日志(注意,为了避免混淆,您可能应该将其称为UserJournals
)。
请记住,GAE是一个非关系数据存储,有时您必须与使用SQL的方式有所不同。
您可以遵循本指南,该指南以优雅的方式描述了如何在Google Appengine上为实体关系建模。
您可以采取相反的方法,例如在JournalItem实体中创建一个Journal的引用,并为其分配一个collection_name
class JournalItem:
Journal = db.ReferencePoperty(Journal, collection_name='journal_items')
name = db....
content = db...
您将能够以这种方式迭代JournalItems:
for item in journal.journal_items
logging.info(item.content)