2011-05-16 4 views
3

Supposons que j'ai une définition de modèle comme celui-ci:Comment mettre à jour un modèle

class Image(db.Model): 
    id = db.StringProperty() 
    url = db.URLProperty() 

Maintenant, je veux ajouter quelques champs à ce modèle pour la faire ressembler à ceci:

class Image(db.Model): 
    id = db.StringProperty() 
    url = db.URLProperty() 
    width = db.IntegerProperty() 
    height = db.IntegerProperty() 

Ainsi, ce nouveau modèle sera appliqué correctement aux entités Image nouvellement ajoutées. Mais je veux aussi mettre à jour les entités déjà existantes afin qu'elles contiennent ces deux nouveaux champs et les remplir de valeurs. Est-ce qu'une entité déjà existante obtiendra ces deux champs automatiquement alors quand je me réfère à eux, cela me donnera des champs vides ou cela provoquera-t-il une erreur? Je suppose que je vais devoir créer une fonction d'aide qui va passer par toutes les entités existantes et définir de nouvelles valeurs de champs, non? Alors, que dois-je garder à l'esprit et comment faire mieux cette mise à jour du modèle? Je pense que cela arrivera parfois au fur et à mesure que l'application émergera, alors je pense qu'il serait utile d'avoir un flux direct pour le faire.

+0

J'ai écrit un billet de blog il y a quelques années qui pourrait vous aider: http://kupuguy.blogspot.com/2008/05/migrating-models.html – Duncan

Répondre

3

Cette exacte scénario est couvert dans la section (articles) docs GAE:

Updating your model's schema.

Fondamentalement, il suffit de changer le modèle d Définissez comme vous l'avez fait, puis effectuez une opération pour fournir des valeurs par défaut pour toutes vos entités existantes. Il y a plusieurs façons de faire la deuxième partie - l'article en décrit une.

+0

Merci, ça couvre la chose dont j'ai besoin. –

2

Aucune entité déjà existante n'obtiendra automatiquement ces deux champs ou ne l'assumera pas sur None. Cela provoquera une erreur lorsque ces champs sont accédés dans des objets existants. La seule solution disponible maintenant est d'utiliser remote_apy et d'écrire votre propre script pour mettre à jour les enregistrements existants. Ce ne sera pas une grosse affaire, écrire un script pour obtenir tous les enregistrements du datastore et de définir des valeurs par défaut pour les nouveaux attributs ..

  1. Setting_Up_remote_api
  2. Update_schema
+0

@Wooble c'est ce que je voulais dire ... –

Questions connexes