首页 > 解决方案 > 删除模型行时的意外行为

问题描述

情况:

我有两个模型类,在同一个项目的两个不同应用程序中。在约会.models 中定义的医生类是与医生相关的一组属性,如姓名、用户名、电子邮件、电话等。DoctorProfilePic 类是在 Clinic.models 中定义的模型,它有一个存储图像的 StdImageField。医生具有到 DoctorProfilePic 的双向映射。

class doctor(models.Model):
    docid = models.AutoField(primary_key=True, unique=True) # Need autoincrement, unique and primary
    name = models.CharField(max_length=35)
    username = models.CharField(max_length=15)
    ...
    profilepic = models.ForeignKey(DoctorProfilePic, blank=True, null=True, on_delete=models.CASCADE)
    ...

class DoctorProfilePic (models.Model):
    id = models.AutoField(primary_key=True, unique=True)
    name = models.CharField(max_length=255, blank=True)
    pic = StdImageField(upload_to="data/media/%Y/%m/%d", blank=True, variations={
        'large': (600, 400),
        'thumbnail': (150, 140, True),
        'medium': (300, 200),
    })
    doc = models.ForeignKey('appointments.doctor', blank=True,
                            null=True, on_delete=models.CASCADE)

预期反应:

当用户从选择框中选择一张个人资料图片并单击删除时,django 应该从医生上传的图片集中删除图片。

问题:

单击删除按钮时,django 会同时删除图片和医生,而不仅仅是前者。

代码:

def removeprofpic(request, docid):
    docid = int(docid)    
    if not IsOwnerorSuperUser(request, docid):
        return HttpResponse("You dont have permissions to do this.")
    doc = doctor.objects.get(docid = docid)
    if request.method == 'POST':
        print(request.POST)
        picid = int(request.POST.get('profilepic'))
        print(f'doc:{doc} picid:{picid}')
        pic = DoctorProfilePic.objects.get(doc = doc, id =picid)
        pic.delete()
        msg = f"Successfully removed profile picture."
    else:
        msg = "Not a valid POST"
    return HttpResponse(msg)

现在我猜我的问题在于定义 on_delete=models.CASCADE?有人可以解释我做错了什么吗?

编辑:我需要的是,当删除链接到医生的个人资料图片时,将医生的图片设置为空(SETNULL?),但是当删除医生时,应该删除文档和图片(CASCADE?)。

标签: djangodjango-models

解决方案


改变

pic.delete()

pic.file.delete()

编辑

改变

profilepic = models.ForeignKey(DoctorProfilePic, blank=True, null=True, on_delete=models.CASCADE)

profilepic = models.ForeignKey(DoctorProfilePic, blank=True, null=True, on_delete=models.DO_NOTHING)

推荐阅读