【问题标题】:Unexpected behavior on delete of a model row删除模型行时的意外行为
【发布时间】:2018-11-27 18:25:41
【问题描述】:

情况:

我有两个模型类,在同一个项目的两个不同应用程序中。在约会.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?谁能解释我做错了什么?

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

【问题讨论】:

    标签: django django-models


    【解决方案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)
    

    【讨论】:

    • 我想你误解了我的问题。请参阅最后一段中的修改。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-27
    • 2015-12-15
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    相关资源
    最近更新 更多