【发布时间】: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