Can I get the value of an object field some other way than obj.field
? Does something like obj.get('field')
exist? Same thing for setting the value of the field.
Asked
Active
Viewed 3.5k times
28
-
possible duplicate of [How to introspect django model fields?](http://stackoverflow.com/questions/2384436/how-to-introspect-django-model-fields) – Anurag Uniyal Sep 02 '11 at 18:25
4 Answers
71
To get the value of a field:
getattr(obj, 'field_name')
To set the value of a field:
setattr(obj, 'field_name', 'field value')
To get all the fields and values for a Django object:
[(field.name, getattr(obj,field.name)) for field in obj._meta.fields]
You can read the documentation of Model _meta API which is really useful.

Mohammed Shareef C
- 3,829
- 25
- 35

João Marcus
- 1,610
- 1
- 13
- 20
-
2or, to update '''obj''' with items from a dictionary: [setattr(obj, key, value) for (key, value) in dictionary.items()] – mariotomo Aug 19 '09 at 12:15
6
why do you want this?
You could use
obj.__dict__['field']
i guess... though it's not a method call
changed=[field for (field,value) in newObj.__dict__ if oldObj.__dict__[field] != value]
will give you a list of all the fields that where changed.
(though I'm not 100% sure)

elzapp
- 1,961
- 4
- 15
- 22
-
after submitting an edit form for that object I have: oldObj = ObjModel.objects.get(pk=pk) newObj = editForm.save(commit = False) and I want to compare the two objects, I need to know which fields were changed by the edit form. Is there any way easier way of doing that, except comparing the objects field by field? – dandu Apr 18 '09 at 15:26
-
Doesn't always work (foreign keys break this). Use @João Marcus answer instead. – pseudosudo May 13 '14 at 19:57
3
If somebody stumbles upon this little question, the answer is right here: How to introspect django model fields?
2
To get related fields:
def getattr_related(obj, fields):
a = getattr(obj, fields.pop(0))
if not len(fields): return a
else: return getattr_related(a, fields)
E.g.,
getattr_related(a, "some__field".split("__"))
Dunno, perhaps there's a better way to do it but that worked for me.