【问题标题】:Can you find out if a Django Model instance is "dirty"?你能找出 Django 模型实例是否“脏”吗?
【发布时间】:2010-11-11 14:32:56
【问题描述】:

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

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

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

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

【问题讨论】:

标签: django orm sqlalchemy


【解决方案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

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

from django.db import models
models.Model.__bases__ = (DirtyMixin,) + models.Model.__bases__

【讨论】:

  • 如果模型还没有保存,这不会抛出异常吗?似乎应该抓住它并返回True
  • 是的,这可能是一个疏忽。
  • AttributeError: 'MyObject' 对象没有属性 'get'。你不是说像 self.__class__.objects.get(pk=self.pk) 这样的东西吗?
  • @Julian 很可能。
  • getattr(self, f.name) 而不是 dunder 方法可能会更清洁...
【解决方案2】:

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

【讨论】:

  • 这是一个很好的答案,但如果它包含代码而不仅仅是一个链接会更好。
【解决方案3】:

尝试使用lck.djangoTimeTrackable

【讨论】:

  • 不错。这看起来是一种强大的方法。
猜你喜欢
  • 2012-11-02
  • 2011-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 2019-02-27
  • 2019-09-01
相关资源
最近更新 更多