不使用GenericRelation,用GenericForeignKey级联删除模型



我正在创建一个可重用的django应用程序,其中包括一个模型与GenericForeignKey,我需要被级联删除。

这个模型可以附加到任何其他模型上。我无法控制目标模型类,因为它在应用程序之外。这意味着我不能添加GenericRelation字段到它,也不能强迫用户添加它,因为目标可能在另一个第三方应用程序中。

假设我们有这样的模型(对PostPostGroup没有控制):

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)

是否有办法删除TagPostGroup查询集被删除的情况下?

。不仅是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信号提供替代行为。

最新更新