12

我真的很喜欢 SQLAlchemy 的特性,它允许您查看对象是否脏:自从从数据库中检索到它之后,它是否被修改过,或者上次保存它时是否被修改过。

是否可以从 Django ORM 中找到这些信息?

请注意,这与django 中的 Dirty 字段不同,因为我不关心以前的数据是什么,尽管 S.Lott 的答案可能提供了一种方法,但我想要一种不会命中的方法数据库。

我也看过django.db.transaction.is_dirty(),但这似乎不是解决方案。

4

3 回答 3

4

执行数据库查询的解决方案:

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

然后,您可以将其作为祖先类添加到模型中。或者,如果您愿意,可以对 forms.Model 类进行猴子补丁。

from django.db import models
models.Model.__bases__ = (DirtyMixin,) + models.Model.__bases__
于 2009-07-17T06:10:22.273 回答
2

另一种方式,涉及覆盖,在这个 Django ticket__setattr__中有详细的讨论。

于 2009-07-17T06:43:39.930 回答
1

尝试使用lck.djangoTimeTrackable

于 2012-09-14T08:37:29.993 回答