【问题标题】:When I delete the model, How can I delete the inlines data and the uploaded file删除模型时,如何删除内联数据和上传的文件
【发布时间】:2013-05-17 04:53:55
【问题描述】:

models.py

    class Issue(models.Model):
        issueId = models.AutoField(primary_key=True)
        title = models.CharField(max_length = 20)
        year = models.IntegerField()
        issueDate = models.DateField()

    class Preview(models.Model):
        issueId = models.ForeignKey(Issue);
        previewPath = models.FileField(upload_to='./upload/magazine_sample')

admin.py

    class PreviewInline(object):
        model = Preview
        extra = 1
        style = 'accordion'
        max_num = 1

    class IssueAdmin(object):
        list_display = ('title',)
        inlines = [PreviewInline]

    admin.site.register(Issue, IssueAdmin)

删除问题模型时如何删除预览和上传的文件?谁能帮帮我?

【问题讨论】:

    标签: django models inlines


    【解决方案1】:

    您确定该问题没有被删除吗? ForeignKey 的默认行为是级联删除:

    ForeignKey.on_delete 当 ForeignKey 引用的对象被删除时,Django 默认模拟 SQL 约束 ON DELETE CASCADE 的行为 并删除包含 ForeignKey 的对象。这种行为 可以通过指定 on_delete 参数来覆盖。

    你在使用 sqlite3 吗?我不确定它是否默认启用了级联。

    要删除图像,您可能需要使用pre_delete 信号:

    from django.db.models.signals import pre_save
    from django.dispatch import receiver
    from myapp.models import Preview
    
    @receiver(pre_delete, sender=Preview)
    def delete_image(sender, instance, using):
        # delete the image -> instance.previewPath
    

    有关信号的更多信息: https://docs.djangoproject.com/en/dev/ref/signals/#django.db.models.signals.pre_delete https://docs.djangoproject.com/en/dev/topics/signals/

    【讨论】:

    • issue和preview都删除了,我要删除上传文件
    • 要删除图像,您可能需要使用 post_delete 信号
    • 我是 django 世界的新人。如何使用 post_delete 信号?
    • 它很简单,您只需要知道文档:docs.djangoproject.com/en/dev/topics/signals。将信号视为事件;您注册他们,他们稍后会被调用。
    • 我已经更新了答案,请查看示例。请注意,我从 post_delete 更改为 pre_delete。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-27
    • 1970-01-01
    • 2013-10-22
    • 1970-01-01
    • 2011-07-19
    • 1970-01-01
    • 2012-02-09
    相关资源
    最近更新 更多