我正在创建一个可重用的django应用程序,其中包括一个模型与GenericForeignKey
,我需要被级联删除。
这个模型可以附加到任何其他模型上。我无法控制目标模型类,因为它在应用程序之外。这意味着我不能添加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)
是否有办法删除Tag
在PostGroup
查询集被删除的情况下?
。不仅是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()
查看这里的文档
与ForeignKey不同,GenericForeignKey不接受on_delete参数来定制此行为;如果需要,您可以通过不使用GenericRelation来避免级联删除,并且可以通过pre_delete信号提供替代行为。