Можете ли вы узнать, является ли экземпляр Django Model "грязным"?
Мне очень нравится функция SQLAlchemy, которая позволяет вам увидеть, загрязнен ли объект: если он был изменен, поскольку он был извлечен из базы данных или последний раз, когда он был сохранен.
Можно ли найти эту информацию из ORM Django?
Заметьте, что это не то же самое, что Грязные поля в django, так как мне все равно, что были предыдущие данные, хотя ответ S.Lott может предоставить способ сделать это, но я хотел бы, чтобы путь не попадал в базу данных.
Я также посмотрел на django.db.transaction.is_dirty()
, но это не похоже на решение.
Ответы
Ответ 1
Решение, выполняющее запрос базы данных:
class DirtyMixin(object):
@property
def is_dirty(self):
db_obj = self.__class__.objects.get(self.pk)
for f in self._meta.local_fields:
if self.__getattribute__(f.name) != db_obj.__getattribute__(f.name):
return True
return False
Затем вы можете добавить это как класс предка к модели. Или, обезьяна-патч формы. Класс модели, если хотите.
from django.db import models
models.Model.__bases__ = (DirtyMixin,) + models.Model.__bases__
Ответ 2
Другой способ, связанный с переопределением __setattr__
, обсуждается в этот Django-билет.
Ответ 3
попробуйте использовать lck.django класс TimeTrackable