在不使用 GenericRelation 的情况下使用 GenericForeignKey 级联删除模型
Cascade delete of model with GenericForeignKey without using GenericRelation
我正在创建一个可重复使用的 Django 应用程序,其中包含一个带有 GenericForeignKey
的模型,我需要将其级联删除。
此模型可以附加到任何其他模型。我无法控制目标模型 class,因为它在应用程序之外。这意味着我不能向它添加 GenericRelation
字段,也不能强制用户添加它,因为目标可能在另一个第三方应用程序中。
假设我们有这样的模型(无法控制 Post
和 PostGroup
):
class Tag(models.Model):
content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
object_id = models.PositiveIntegerField()
object = GenericForeignKey()
class PostGroup(models.Model):
title = models.CharField(max_length=255)
class Post(models.Model):
title = models.CharField(max_length=255)
group = models.ForeignKey(PostGroup, on_delete=models.CASCADE)
在 PostGroup
查询集被删除的情况下,是否有删除 Tag
的方法?
例如不仅 post_group.delete()
还有 PostGroup.objects.delete()
.
您可以使用 pre_delete
信号来实现:
from django.db.models.signals import pre_delete
from django.dispatch import receiver
@receiver(pre_delete) # add relevant sender to signal (not mandatory)
def post_group_deleted(sender, instance, using, **kwargs):
# Query tags with the instance of PostGroup and delete them
if isinstance(instance, Tag):
return
Tag.objects.filter(
content_type=ContentType.objects.get_for_model(instance),
object_id=instance.pk
).delete()
查看文档 here
Unlike ForeignKey, GenericForeignKey does not accept an on_delete argument to customize this behavior; if desired, you can avoid the cascade-deletion by not using GenericRelation, and alternate behavior can be provided via the pre_delete signal.
我正在创建一个可重复使用的 Django 应用程序,其中包含一个带有 GenericForeignKey
的模型,我需要将其级联删除。
此模型可以附加到任何其他模型。我无法控制目标模型 class,因为它在应用程序之外。这意味着我不能向它添加 GenericRelation
字段,也不能强制用户添加它,因为目标可能在另一个第三方应用程序中。
假设我们有这样的模型(无法控制 Post
和 PostGroup
):
class Tag(models.Model):
content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
object_id = models.PositiveIntegerField()
object = GenericForeignKey()
class PostGroup(models.Model):
title = models.CharField(max_length=255)
class Post(models.Model):
title = models.CharField(max_length=255)
group = models.ForeignKey(PostGroup, on_delete=models.CASCADE)
在 PostGroup
查询集被删除的情况下,是否有删除 Tag
的方法?
例如不仅 post_group.delete()
还有 PostGroup.objects.delete()
.
您可以使用 pre_delete
信号来实现:
from django.db.models.signals import pre_delete
from django.dispatch import receiver
@receiver(pre_delete) # add relevant sender to signal (not mandatory)
def post_group_deleted(sender, instance, using, **kwargs):
# Query tags with the instance of PostGroup and delete them
if isinstance(instance, Tag):
return
Tag.objects.filter(
content_type=ContentType.objects.get_for_model(instance),
object_id=instance.pk
).delete()
查看文档 here
Unlike ForeignKey, GenericForeignKey does not accept an on_delete argument to customize this behavior; if desired, you can avoid the cascade-deletion by not using GenericRelation, and alternate behavior can be provided via the pre_delete signal.