【问题标题】:determine if Django model is marked for deletion确定 Django 模型是否被标记为删除
【发布时间】:2017-07-15 15:19:20
【问题描述】:

我的示例非常做作,但希望它能够传达重点。

假设我有两个这样的模型:

class Group(models.Model):
    name = models.CharField(max_length=50)

class Member(models.Model):
    name = models.CharField(max_length=50)
    group = models.ForeignKey(Group)

我想添加一些代码,以便在删除 Member 时将其重新创建为新条目(记住,非常做作!)。所以我这样做:

@receiver(post_delete, sender=Member)
def member_delete(sender, instance, **kwargs):
    instance.pk = None
    instance.save()

这对于删除 Member 时非常有效。

但问题是,如果 Group 被删除,则会调用相同的处理程序。 Member 使用对 Group 的引用重新创建,并在最终提交发生时抛出 IntegrityError

信号处理程序中是否有任何方法可以确定Group 正在被删除?

我尝试过的:

  • 不管怎样,sender 似乎总是Member
  • 我似乎在instance.group 上找不到任何表示删除的信息。即使尝试执行 Group.objects.filter(id=instance.group_id).exists() 也会返回 true。可能是在子级上发生post_delete 调用之后,父级的实际删除发生了,在这种情况下,我试图做的事情是不可能的。

【问题讨论】:

  • 如果有相关成员的群组被删除,最终结果应该是什么?
  • @knbk - Member 应该被删除而不是移动到另一个 Group。因此,没有信号处理程序会发生默认情况。
  • 您使用的是什么数据库,您的事务的隔离级别是多少?
  • @knbk - Postgres,每个网络请求都有一个事务

标签: python django django-models django-signals


【解决方案1】:

尝试通过 Member 类中的类方法来完成你的工作,忘记信号。

@classmethod
def reinit(cls, instance):
    instance.delete()
    instance.save()

【讨论】:

  • 是的,但是您必须始终记住调用该方法。在调用 .delete() 之后调用信号。
  • 是的。你只需要记住调用 reinit 而不是 delete。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-01
  • 2015-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-08
相关资源
最近更新 更多