Tuesday, June 18, 2019

Re: Package that helps update only changed fields

Hello Dan,

I'm not aware of any third party library handling this but a simple way to achieve
what you're after would be to subclass ModelForm in order to override save()
and pass commit=False in your super() call.

e.g. (untested)

class UpdateFieldsModelForm(ModelForm):
    update_fields = None

    def save(self, commit=True):
        instance = super().save(commit=False)
        if commit:
            update_fields = None if instance._state.adding else self.update_fields
            instance.save(update_fields=self.update_fields)
        return instance

Cheers,
Simon

Le mardi 18 juin 2019 11:38:53 UTC-4, Dan Davis a écrit :
So, I recently observed that a Django ModelForm updates all columns when it is updating a model instance. This is appropriate for a typical situation where Django is also in control of the schema.
I also see that you can control this behavior by passing update_fields to the save method, in a particular form:

    self.instance.save(update_fields=self.changed_data)

I have some complicated forms that have non-model fields and many-to-many fields mixed in there.   I'm wondering whether there is a module for Django out there that gives me some base ModelForms that do not update all fields, but only changed fields.  I am asking because I don't want to work hard to handle corner cases if there's something already out there.   What I already have is hard-coded to the form where I've made this change to do only a limited update.

Thanks,

-Dan

--
You received this message because you are subscribed to the Google Groups "Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to django-users+unsubscribe@googlegroups.com.
To post to this group, send email to django-users@googlegroups.com.
Visit this group at https://groups.google.com/group/django-users.
To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/8dd0ebb7-3686-4477-b7ee-0b482312d65c%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

No comments:

Post a Comment