Django в настоящее время отправляет все столбцы в базу данных, даже если вы только что изменили один. Чтобы изменить это, потребуются некоторые изменения в системе баз данных. Это можно легко реализовать в существующем коде, добавив в модель набор грязных полей и добавив в нее имена столбцов, каждый раз, когда вы __set__
значение столбца.
Если вам нужна эта функция, я бы посоветовал вам взглянуть на Django ORM, внедрить его и поместить патч в трек Django. Это должно быть очень легко добавить, и это поможет другим пользователям. Когда вы сделаете это, добавьте ловушку, которая вызывается каждый раз, когда устанавливается столбец.
Если вы не хотите взламывать сам Django, вы можете скопировать указание на создание объекта и изменить его.
Может быть, с таким миксином:
class DiffingMixin(object):
def __init__(self, *args, **kwargs):
super(DiffingMixin, self).__init__(*args, **kwargs)
self._original_state = dict(self.__dict__)
def get_changed_columns(self):
missing = object()
result = {}
for key, value in self._original_state.iteritems():
if key != self.__dict__.get(key, missing):
result[key] = value
return result
class MyModel(DiffingMixin, models.Model):
pass
Этот код не проверен, но должен работать. Когда вы звоните model.get_changed_columns()
, вы получаете изложение всех измененных значений. Это, конечно, не будет работать для изменяемых объектов в столбцах, потому что исходное состояние является плоской копией dict.