问题内容
我有一个页面模型,在保存对象期间调用 save 方法中的打印。但是,当对象被删除时,不会触发任何打印,并且似乎永远不会调用删除方法。那么我应该如何覆盖默认的删除方法呢?
class Page(models.Model):
image = models.ImageField()
number = models.PositiveIntegerField(default=0, blank=True, null=True)
chapter = models.ForeignKey(Chapter, on_delete=models.CASCADE)
def get_upload_path(self, filename):
work_slug = self.chapter.volume.work.slug
translator_name = slugify(self.chapter.volume.translator)
volume_number = self.chapter.volume.number
chapter_number = self.chapter.number
name, extension = filename.rsplit('.', 1)
return f'media/{work_slug}/{translator_name}/volumes/volume-{volume_number}/chapters/chapter-{chapter_number}/page-{self.number}.{extension}'
def save(self, *args, **kwargs):
if not self.pk:
last_page = self.chapter.page_set.last()
if last_page:
self.number = last_page.number + 1
self.image.name = self.get_upload_path(self.image.name)
self.image.storage = s3
print(f"Saving Page with image: {self.image.name}")
super().save(*args, **kwargs)
def delete(self, *args, **kwargs):
print(f"Deleting Page with image: {self.image.name}")
image_name = self.image.name
try:
s3.delete(image_name)
print(f"Successfully deleted from S3: {image_name}")
except Exception as e:
print(f"Error deleting from S3: {e}")
super().delete(*args, **kwargs)
正确答案
删除一个对象时调用 model 的 delete
方法。如果您尝试删除查询集(例如从 django 管理列表页面删除),您必须覆盖模型的查询集。
class PageQuerySet(models.QuerySet):
def delete(self):
print("deleting queryset")
return super().delete()
class PageManager(models.Manager):
def get_queryset(self):
return PageQuerySet(model=self.model, using=self._db, hints=self._hints)
class Page(models.Model):
image = models.ImageField()
number = models.PositiveIntegerField(default=0, blank=True, null=True)
chapter = models.ForeignKey(Chapter, on_delete=models.CASCADE)
objects = PageManager()
def get_upload_path(self, filename):
work_slug = self.chapter.volume.work.slug
translator_name = slugify(self.chapter.volume.translator)
volume_number = self.chapter.volume.number
chapter_number = self.chapter.number
name, extension = filename.rsplit('.', 1)
return f'media/{work_slug}/{translator_name}/volumes/volume-{volume_number}/chapters/chapter-{chapter_number}/page-{self.number}.{extension}'
def save(self, *args, **kwargs):
if not self.pk:
last_page = self.chapter.page_set.last()
if last_page:
self.number = last_page.number + 1
self.image.name = self.get_upload_path(self.image.name)
self.image.storage = s3
print(f"Saving Page with image: {self.image.name}")
super().save(*args, **kwargs)
def delete(self, *args, **kwargs):
print(f"Deleting Page with image: {self.image.name}")
image_name = self.image.name
try:
s3.delete(image_name)
print(f"Successfully deleted from S3: {image_name}")
except Exception as e:
print(f"Error deleting from S3: {e}")
super().delete(*args, **kwargs)
以上就是重写 django 模型中的删除方法的详细内容,更多请关注编程网其它相关文章!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
软考中级精品资料免费领
- 历年真题答案解析
- 备考技巧名师总结
- 高频考点精准押题
- 资料下载
- 历年真题
193.9 KB下载数265
191.63 KB下载数245
143.91 KB下载数1148
183.71 KB下载数642
644.84 KB下载数2756
相关文章
发现更多好内容猜你喜欢
AI推送时光机重写 django 模型中的删除方法
后端开发2024-02-11
mysql中删除重复记录的方法
后端开发2024-04-02
重用模型并从 Fiber/MongoDB 的响应中删除字段
后端开发2024-02-08
shell中删除文件中重复行的方法
后端开发2022-06-04
Django框架中模型的用法
后端开发2024-04-02
MySQL删除重复数据的方法
后端开发2024-04-02
SQL删除重复数据的方法
后端开发2024-04-02
删除数据库中重复数据的方法
后端开发2024-04-02
windows中zbrush如何删除多余的模型
后端开发2022-12-03
pd.drop_duplicates删除重复行的方法实现
后端开发2024-04-02
sql中删除重复数据的方法是什么
后端开发2024-04-08
mysql删除数据库中重复记录的方法
后端开发2024-04-02
redis模糊批量删除key的方法
后端开发2022-12-16
word模板的删除方法是什么
后端开发2023-09-29
django模型层(model)进行建表、查询与删除的基础教程
后端开发2022-06-04
利用Python删除电脑中重复文件的方法
后端开发2024-04-02
javascript中cookie删除的方法
后端开发2023-06-14
yum中删除phpmyadmin的方法
后端开发2024-04-02
MySQL中查询、删除重复记录的方法大全
后端开发2018-05-22
MySQL中查询、删除重复记录的方法大全
后端开发2022-08-10
咦!没有更多了?去看看其它编程学习网 内容吧