Можете ли вы узнать, является ли экземпляр 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-билет.