django - 删除模型行时的意外行为
问题描述
情况:
我有两个模型类,在同一个项目的两个不同应用程序中。在约会.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?)。
解决方案
改变
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)
推荐阅读
- c++ - 试图从txt文件中读取两条数据并输出[C++]
- jquery - 如何将工具提示添加到特定的 jsTree 节点
- c++ - 使用 make 将目标文件放在特定目录中
- html - 选择选项中的HTML
- c++ - 在 tensorflow-gpu>=1.15 中使用用户运算符时未定义的符号
- regex - 如果 word_B 和 word_C 在彼此的 N 个单词中,并且 word_A 不在前面的 M 个单词中,则正则表达式匹配
- javascript - 在 html5 视频中切换音量
- javascript - 使用 event.preventDefault() 时 Owl Carousel 2 不起作用
- xcode - dylib 位置中的 macOS SDK 依赖项
- c - C中三元运算符中的条件表达式