我的Django模型中有两个表,分类和图像。
当我创建一个类别时,一个图像会自动创建,当一个类别删除时,相应的图像将被销毁。
我覆盖了类别中的delete()
方法。当我单击对象的详细信息页面中的删除按钮(它删除相应的图像对象)时,它可以正常工作:
但是当我想删除列出的对象页面中的Category对象时:
它不会删除相应的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)
提前致谢。
答案 0 :(得分:2)
您需要使用信号在当前的数据库模型中执行此操作。问题来自queryset删除工作的方式,文档解释here。当您使用列表视图删除类别时,它会执行查询集删除,这不会触发模型的删除。
正如您现在设置的内容一样,您可以听取post_delete
的{{1}}(或pre_delete
)信号。请参阅有关信号here
所有这一切,都有一种更简单的方式来达到你想要的目的:
将Category
变为有意义的内容,例如image_id
,并将其设置为
category
然后,当您删除category = models.ForeignKey('Category', on_delete=models.CASCADE)
对象时,它还将删除外键关系设置为Category
的图像。更干净。