Django中如何正确删除Model对象的单个字段值
问题原因
- 问题核心是错误调用了
delete()方法:如果你的tag_number实际是关联到其他模型的外键字段,且配置了on_delete=models.CASCADE,删除关联的标签对象时会触发级联删除,把对应的Book实例一起删掉。 - 就算
tag_number是你贴出的PositiveIntegerField类型,整数类型的值本身没有delete()方法,你的写法本身存在逻辑错误,且delete()方法返回的是删除计数元组,完全不可以赋值给整数字段。 - 仅要替换字段值的场景下,完全不需要额外执行删除旧值的操作,直接赋值新值就会自动覆盖旧值。
正确实现
如果不需要保留原字段值,直接赋值新生成的标签即可,无需额外的删除操作:
# @require_POST def book_tag(request, pk): book = get_object_or_404(Book, pk=pk) book.tag_number = book.generate_tag() book.save() return redirect('book:book-list')
如果你确实需要先清空字段值再赋值(比如需要触发对应字段的更新钩子、信号等特殊场景),首先要修改字段定义允许为空:
tag_number = models.PositiveIntegerField( 'Tag number', validators=[MinValueValidator(1), MaxValueValidator(MAX_TAG_NUMBER)], null=True, blank=True )
再调整视图代码:
# @require_POST def book_tag(request, pk): book = get_object_or_404(Book, pk=pk) # 清空字段值直接赋值None即可,不需要调用delete方法 book.tag_number = None book.save() book.tag_number = book.generate_tag() book.save() return redirect('book:book-list')
内容的提问来源于stack exchange,提问作者Ken Ist
相关产品推荐
相关产品推荐

