Classe Expando

Remarque : Les développeurs qui créent des applications sont vivement encouragés à utiliser la bibliothèque cliente NDB qui présente plusieurs avantages supplémentaires par rapport à cette bibliothèque cliente, tels que la mise en cache automatique des entités via l'API Memcache. Si vous utilisez actuellement l'ancienne bibliothèque cliente DB, consultez le guide de migration de DB vers NDB.

La classe Expando est une superclasse de définitions de modèles de données dont les propriétés sont déterminées dynamiquement. Un modèle Expando peut combiner des propriétés fixes semblables à celles d'une classe Model et des propriétés dynamiques attribuées à une entité au moment de l'exécution.

La classe Expando est fournie par le module google.appengine.ext.db.

La classe Expando est une sous-classe de Model et hérite de cette classe et de ses méthodes d'instances. La classe Expando ne définit ni ne remplace aucune méthode.

Introduction

Un modèle Expando peut avoir des propriétés fixes et des propriétés dynamiques. Les propriétés fixes se comportent de la même manière que les propriétés d'une classe Model et sont également définies dans la classe de modèle Expando à l'aide d'attributs de classe. Les propriétés dynamiques sont créées lorsque l'application leur affecte des valeurs sur l'instance. Deux instances de la même classe Expando peuvent comporter des ensembles de propriétés dynamiques distincts, et des propriétés dynamiques de même nom mais de types différents. Les propriétés dynamiques sont toujours facultatives et ne possèdent aucune valeur par défaut : elles n'existent pas tant qu'une valeur ne leur est pas affectée.

Les propriétés dynamiques ne peuvent pas utiliser les instances Propriété pour effectuer une validation, définir des valeurs par défaut ou appliquer une logique automatique aux valeurs. Les propriétés dynamiques stockent tout simplement des valeurs correspondant aux types pris en charge par le datastore. Consultez la page Types et classes de propriétés.

En outre, contrairement aux propriétés fixes, les propriétés dynamiques ne peuvent pas utiliser un nom différent pour l'attribut de la classe et le nom de la propriété du datastore. Consultez la section Noms de propriétés interdits.

Conseil : Si vous souhaitez valider une valeur de propriété dynamique à l'aide d'une classe de propriété, vous pouvez instancier la classe de propriété et appeler sa méthode validate() sur la valeur.

Une sous-classe Expando peut définir des propriétés fixes semblables à celles d'une classe Model. Le comportement des propriétés fixes d'une classe Expando est semblable à celui des propriétés d'une classe Model. Une instance Expando peut comporter des propriétés fixes et des propriétés dynamiques.

import datetime

from google.appengine.ext import db

class Song(db.Expando):
    title = db.StringProperty()

crazy = Song(title='Crazy like a diamond',
             author='Lucy Sky',
             publish_date='yesterday',
             rating=5.0)

hoboken = Song(title='The man from Hoboken',
               author=['Anthony', 'Lou'],
               publish_date=datetime.datetime(1977, 5, 3))

crazy.last_minute_note=db.Text('Get a train to the station.')

Vous pouvez supprimer les propriétés dynamiques (non fixes) d'une instance Expando. Pour supprimer une propriété dynamique, une application supprime l'attribut de l'instance :

del crazy.last_minute_note

Constructeur

Le constructeur de la classe Expando est défini comme suit :

class Expando(parent=None, key_name=None, **kwds)

Classe Model dont les propriétés n'ont pas besoin d'être définies dans la classe avant utilisation. Tout comme la classe Model, la classe Expando doit être sous-classée pour définir le genre des entités de données.

La classe Expando est une sous-classe de Model, et hérite ou remplace ses méthodes.

Arguments

parent
Instance Model ou Key de l'entité parente de la nouvelle entité.
key_name

Nom de la nouvelle entité. Le nom fait partie de la clé primaire. Si la valeur est None, un identifiant généré par le système est utilisé comme clé.

La valeur de key_name ne doit pas commencer par un nombre et ne doit pas se présenter au format __*__. Si l'application utilise des données soumises par l'utilisateur en tant que noms de clés d'entité Datastore (telles qu'une adresse e-mail), elle doit d'abord nettoyer la valeur pour satisfaire ces exigences, par exemple en la préfixant à l'aide d'une chaîne connue telle que "key:".

Le nom key_name est stocké sous la forme d'une chaîne Unicode, avec les valeurs str converties en texte ASCII.

**kwds
Valeurs initiales des propriétés de l'instance, sous forme d'arguments de mot clé. Chaque nom correspond à un attribut de la nouvelle instance, et peut soit correspondre à des propriétés fixes définies dans la classe Expando, soit représenter des propriétés dynamiques.