你能看出Django Model实例是否“脏”吗?

时间:2009-07-17 05:11:37

标签: django orm sqlalchemy

我非常喜欢SQLAlchemy的功能,它允许您查看对象是否是脏的:如果它是从数据库中检索到的,或者是上次保存它时已被修改过。

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

请注意,这与Dirty fields in django不同,因为我不关心以前的数据是什么,虽然S.Lott的回答可能提供了一种方法,但我想要一种方法没有打到数据库。

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

3 个答案:

答案 0 :(得分: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__

答案 1 :(得分:2)

另一种涉及覆盖__setattr__的方法,在this Django ticket中进行了详细讨论。

答案 2 :(得分:1)

尝试使用lck.django课程TimeTrackable