2010-05-18 8 views
1

J'ai un modèle avec un champ JSON ou un lien vers un document CouchDB. Je peux actuellement accéder à l'information dynamique d'une manière telle que:Champs dynamique par instance django modèle

genericdocument.objects.get(pk=1) == genericdocument.json_field['sample subfield'] 

au lieu que je voudrais utiliser

genericdocument.sample_subfield 

pour maintenir la compatibilité avec toutes les applications du projet actuellement des actions.

MISE À JOUR

Ceci est très proche de ce que je suis en train de réaliser: http://pypi.python.org/pypi/eav-django/1.0.0 mais en utilisant des champs Django standard à la place.

+1

Quelle est votre question? –

+0

J'essaie d'exposer les clés d'un champ JSON en tant que champs d'un modèle. –

+1

Jetez un oeil à cette réponse: http://stackoverflow.com/a/7934577/497056 –

Répondre

1

Cette question m'a aidé à trouver la solution: How do I override __getattr__ in Python without breaking the default behavior?

class GenericDocument(models.Model): 
    def __getattr__(self, name): 
     data = self.get_couchdb_data() 
     if name in data.keys(): 
      return data[name] 
     else: 
      raise AttributeError 

Le dictionnaire retourné par get_couchdb_data() est exposée sous forme d'attributs de l'instance de modèle.

1

cette aide:

class GenericDocument(models.Model): 
... 
@property 
def sample_subfield(self): 
    return self.json_field['sample_subfield'] 

Cela devrait fonctionner ok pour "connus sample_subfields" s'il n'y a pas de trop.

Si vous voulez être en mesure d'appeler genericdocument.XXX (où XXX peut être quoi que ce soit), alors vous devez remplacer __getattribute__ dans votre modèle que je ne serait pas vraiment mis en consideratino depuis Django fait autant que je sache que lui-même.

Questions connexes