删除模型行时发生意外行为

时间:2018-11-27 18:25:42

标签: django django-models

情况:

我在同一项目的两个不同应用程序中有两个Model类。约会中定义的class doctor类是与医生相关联的一组属性,例如姓名,用户名,电子邮件,电话等。DoctorProfilePic类是Clinical.models中定义的Model,其具有存储图像的StdImageField。 doctor具有到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?有人可以解释我做错了什么吗?

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

1 个答案:

答案 0 :(得分:1)

更改

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)