2012-01-30 1 views
1

Je suis un peu nouveau sur le système de modèles de moteur d'applications google (et tous les modèles de base de données d'ailleurs), et j'essaie de comprendre comment faire un modèle d'une collection d'instances de modèle comme l'un des Propriétés. Quelque part, je pense qu'il doit y avoir une meilleure façon de modéliser les données que j'ai.Google App Engine Model Parents

Voici donc l'exemple. J'écris une webapp de journal. Je veux permettre aux utilisateurs d'avoir des revues multible tel que défini par le modèle 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 

Dans la propriété journals je garde une liste des id du modèle Journal (ci-dessous).

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) 

Dans le modèle Journal je stocke une liste des id de JournalItem cas comme une liste de numéro d'identité

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) 

Je suppose que la question est vraiment comment dois-je modéliser des données avec cette structure (I omettais quelques propriétés pour le simplifier) ​​(montré dans 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" 
      } 
     } 
    } 
} 

J'espère que ce n'était pas trop long pour être agaçant. Toute aide à ce sujet serait grandement appréciée.

Répondre

3

C'est à peu près la façon de le faire, sauf que j'utiliserais un ListProperty(db.Key) au lieu de int. Ensuite, vous pouvez faire db.get(userjournals.journals) pour obtenir tous les journaux de l'utilisateur une fois que vous avez l'instance Journals appartenant à cet utilisateur (notez que pour éviter toute confusion, vous devriez probablement appeler cela quelque chose comme UserJournals). Rappelez-vous que GAE est un magasin de données non relationnel, et parfois vous devez penser un peu différemment de la façon dont vous utiliseriez SQL.

+0

Merci, je ne savais rien au sujet de la différence entre les bases de données non relationnelles et les relationnelles. Je lis sur eux et maintenant je comprends. – giodamelio

1

Vous pouvez suivre ce guide qui décrit de manière élégante comment vous pouvez modéliser vos relations d'entités sur Google Appengine.

L'approche inversée que vous pouvez adopter consiste à créer une référence par exemple d'un journal dans l'entité JournalItem et à lui attribuer un nom de collection.

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

Le vous pourrez parcourir les JournalItems du Journal de cette façon:

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