Wednesday, June 30, 2010

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

The frozenset wasn't any commentary on your approach or speed of
parsing, I just like to use them where-ever possible.

My only concern with your approach was that you were expecting every
field on the model to be in the dictionary. Looping over the
dictionary's items and ignoring any fields that aren't on the model
seems most sensible to me since try/except is relatively slow in
python.

Oh and iteritems as opposed to items wasn't a slight on your coding
either, it's just that it's slightly more memory efficient (but since
items is becoming iteritems in python 3 it doesn't matter too much) :)

On Jun 30, 2:56 pm, Tim Chase <django.us...@tim.thechases.com> wrote:
> >>> 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