谷歌应用引擎模型家长



我对谷歌应用程序引擎模型系统(以及所有数据库模型)有些陌生,我正试图弄清楚如何使模型具有模型实例集合作为属性之一。我觉得必须有一种更好的方法来对我所拥有的数据进行建模。

下面是一个例子。我正在写一个日记网络应用程序。我想允许用户拥有由模型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)

最新更新