2009-04-18 8 views
26

Puis-je obtenir la valeur d'un champ d'objet d'une autre manière que "obj.field". Est-ce que quelque chose comme "obj.get ('field')" existe? Même chose pour définir la valeur du champ.Objets django get/set field

+0

duplication possible de [Comment introspecter des champs de modèle django?] (Http://stackoverflow.com/questions/2384436/how-to-introspect-django-model-fields) –

Répondre

65

Pour obtenir la valeur d'un champ:

getattr(obj, 'field_name') 

Pour définir la valeur d'un champ:

setattr(obj, 'field_name', 'field value') 

Pour tous les champs et valeurs d'un objet Django:

[(field.name, getattr(obj,field.name)) for field in obj._meta.fields] 

Vous pouvez lire la documentation de Model _meta API qui est vraiment utile.

+2

ou, pour mettre à jour '' 'obj' '' avec des éléments d'un dictionnaire: [setattr (obj, clé, valeur) pour (clé, valeur) dans dictionary.items()] – mariotomo

+0

Vous monsieur, êtes un génie. – g33kz0r

6

pourquoi voulez-vous cela?

Vous pouvez utiliser

obj.__dict__['field'] 

... Je suppose que si ce n'est pas un appel de méthode

changed=[field for (field,value) in newObj.__dict__ if oldObj.__dict__[field] != value] 

vous donnera une liste de tous les champs où changé.

(bien que je ne suis pas sûr à 100%)

+0

après avoir envoyé un formulaire d'édition pour cet objet I ont: oldObj = ObjModel.objects.get (pk = pk) newobj = editForm.save (commettras = False) et je veux comparer les deux objets, je dois savoir quels champs ont été modifiés par le formulaire de modification . Existe-t-il un moyen plus simple de faire cela, sauf de comparer les objets par champ? – dandu

+0

Ne fonctionne pas toujours (les clés étrangères cassent ceci). Utilisez @ João Marcus réponse à la place. –

2

Pour obtenir des domaines connexes:

def getattr_related(obj, fields): 
    a = getattr(obj, fields.pop(0)) 
    if not len(fields): return a 
    else:    return getattr_related(a, fields) 

par exemple,

getattr_related(a, "some__field".split("__")) 

ne sais pas, peut-être il y a un meilleure façon de le faire, mais cela a fonctionné pour moi.

Questions connexes