I'd stick to setattr and maybe verify that the key in the dictionary
is one of the model's fields. I think there is a method on _meta
called get_all_field_names. I've used this before to validate such
actions.

If that's the case, you can tweak the above to something like

    for name in obj._meta.get_all_field_names():
      if name in dict_of_field_values:
        setattr(obj, name, dict_of_field_values[name])

I'd probably be a bit more cautious, since get_all_field_names gets
foreign keys and all sorts and the field might not be in the
dictionary.

I'd suggest:

# Make a frozenset of the fields for fast access:
allowed_fields = frozenset(obj._meta.get_all_field_names())

for field, value in dictionary_of_field_values.iteritems():
     if field in allowed_fields:
         setattr(obj, field, value)

You're using different logic than I am, so yes, using a set (or frozen-set) would be better for your loop over the entries in the dict (my original code iterates over the defined field names and tries to look them up in the dict -- dict & set lookups are both O(1) so it only makes a difference if you're doing your lookups in the meta)

-tkc



--
You received this message because you are subscribed to the Google Groups "Django 
users" group.
To post to this group, send email to django-us...@googlegroups.com.
To unsubscribe from this group, send email to 
django-users+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/django-users?hl=en.

Reply via email to