Wednesday, June 30, 2010

Re: Proper approach to updating model object with 100 attributes.

>>> 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-users@googlegroups.com.
To unsubscribe from this group, send email to django-users+unsubscribe@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/django-users?hl=en.

No comments:

Post a Comment