覆盖了delete()方法,无法在django admin的所有部分上工作

时间:2018-05-18 17:06:35

标签: django django-models

我的Django模型中有两个表,分类和图像。

当我创建一个类别时,一个图像会自动创建,当一个类别删除时,相应的图像将被销毁。

我覆盖了类别中的delete()方法。当我单击对象的详细信息页面中的删除按钮(它删除相应的图像对象)时,它可以正常工作:

detail page

但是当我想删除列出的对象页面中的Category对象时:

enter image description here

enter image description here

它不会删除相应的Image对象。

如何修复此问题并删除我选择的每个类别,以便删除每个相应的图像对象?

我的models.py就像:

from django.db.models import Q


class Image(models.Model):
    image_id = models.IntegerField(unique=True, null=True)
    image = models.FileField(upload_to='all/', null=True, blank=True)

    def __str__(self):
        return '%s | %s' % (self.image_id, self.image)

class Category(models.Model):
    category_id = models.IntegerField(primary_key=True, unique=True, editable=False)
    title = models.CharField(max_length=50, null=False, blank=False)
    c_thumbnail = models.FileField(upload_to='img/thumbnailCategory/', null=False, blank=False)

    def delete(self, **kwargs):
        image = Image.objects.get(Q(image_id=self.category_id))
        image.delete()
        super(Category, self).delete()

    def save(self, force_insert=False, force_update=False, *args, **kwargs):
        super(Category, self).save(force_insert, force_update, *args, **kwargs)
        # this will create or update an Image
        Image.objects.update_or_create(image_id=self.category_id, image=self.c_thumbnail)
        super(Category, self).save(force_insert, force_update, *args, **kwargs)

    def __str__(self):
        return '%s | %s' % (self.title, self.category_id)

提前致谢。

1 个答案:

答案 0 :(得分:2)

您需要使用信号在当前的数据库模型中执行此操作。问题来自queryset删除工作的方式,文档解释here。当您使用列表视图删除类别时,它会执行查询集删除,这不会触发模型的删除。

正如您现在设置的内容一样,您可以听取post_delete的{​​{1}}(或pre_delete)信号。请参阅有关信号here

的文档

所有这一切,都有一种更简单的方式来达到你想要的目的:

Category变为有意义的内容,例如image_id,并将其设置为

category

然后,当您删除category = models.ForeignKey('Category', on_delete=models.CASCADE) 对象时,它还将删除外键关系设置为Category的图像。更干净。