如何自动检查sqlalchemy中是否有一个或多个属性被修改?

2024-05-20 19:54:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我有下面的类,它是一个sqlalchemy实例。在

class Cloaker(db.Model):
  id = db.Column(db.Integer, primary_key=True)

  status = db.Column(db.Enum(Status), default=Status.DIRTY)

  domain = db.Column(db.String(32), nullable=False)

  user = db.Column(db.String(32))
  company = db.Column(db.String(32))

我有一个视图函数,我的用户可以在其中更新一个斗篷实例。在

我想要隐形衣状态如果隐形人.域已更新。如果用户/公司已更新,请不要更改状态。在

实施这种检查的最佳方法是什么?在


Tags: 实例用户id隐形dbstringmodelsqlalchemy
1条回答
网友
1楼 · 发布于 2024-05-20 19:54:44

我找到了答案:

class Cloaker(db.Model):
  # Fields that will cause Status to change to dirty if modified.
  dirty_if_mutated = set(['domain'])

  id = db.Column(db.Integer, primary_key=True)

  status = db.Column(db.Enum(Status), default=Status.DIRTY)

  domain = db.Column(db.String(32), nullable=False)
  user = db.Column(db.String(32))
  company = db.Column(db.String(32))

  def change_status_if_necessary(self):
    """Checks if any attributes from dirty_if_mutated is changed.
    If so, change status to Status.DIRTY.
    """
    inspr = inspect(self)
    attrs = class_mapper(self.__class__).column_attrs      # exclude relationships
    changed_attr_keys = set()

    for attr in attrs:
      hist = getattr(inspr.attrs, attr.key).history
      if hist.has_changes():
        changed_attr_keys.add(attr.key)

    if Cloaker.dirty_if_mutated.intersection(changed_attr_keys):
      self.status = Status.DIRTY


def change_status_if_necessary(mapper, connect, target):
  target.change_status_if_necessary()

listen(Cloaker, 'before_update', change_status_if_necessary)

相关问题 更多 >