Django GenericRelation无效

时间:2014-01-02 20:33:20

标签: python django django-models django-contenttypes

我的应用程序中有以下模型,使用内容类型的django框架:

class GenericMedia(models.Model):
    limit           = models.Q(model = 'Image') | models.Q(model = 'Video') | models.Q(model = 'Other')
    content_type    = models.ForeignKey(ContentType, limit_choices_to = limit)
    object_id       = models.PositiveIntegerField()
    content_object  = generic.GenericForeignKey('content_type', 'object_id')

    def __unicode__(self):
        return u"%s" % os.path.basename(self.content_object.url.name)

    def instance(self):
        return self.content_object.__class__.__name__


class Media(models.Model):
    description     = models.CharField(blank = True, max_length = 500)
    link            = models.URLField(blank = True)
    genericFK       = generic.GenericRelation(GenericMedia, content_type_field='content_type', object_id_field='object_id')

    class Meta:
        abstract = True

    def __unicode__(self):
        return u"%s" % os.path.basename(self.url.name)

    def save(self, *args, **kwargs):
        super(Media, self).save(*args, **kwargs)
        generic_link = GenericMedia(content_object = self)
        generic_link.save()


class Image(Media):
    imgW = models.PositiveSmallIntegerField()
    imgH = models.PositiveSmallIntegerField()
    url  = models.ImageField(upload_to = 'mediamanager', height_field = 'imgH', width_field = 'imgW')

Everythings工作正常,除了我的抽象媒体类中的GenericRelation。 在django文档中,据说:

  

如果删除具有GenericRelation的对象,则删除任何对象   指向它的GenericForeignKey也将被删除。

但我的问题是,当我删除图像时,指向它的GenericMedia不会被删除。

如果有人有解决方案,谢谢!

1 个答案:

答案 0 :(得分:0)

正如您所提到的,文档清楚地表明当您删除具有Generic Relation字段的对象时会发生什么(Django删除具有GenericRelation的对象的外键的所有对象)。

所以这基本上是Django的错(可能是抽象类的一些问题),但有一种方法可以克服这种情况。

通过使用pre_delete,您可以使用GenericRelation删除具有该对象外键的所有对象。

pre_delete信号的一些示例可在此处找到:http://www.koopman.me/2015/01/django-signals-example/