Django中如何在保存前获取Post对象ID?当前获取返回None
解决Django CreateView中保存前获取对象ID的问题
嘿,这个坑我之前踩过!你遇到的self.object.id返回None的原因很简单:Django默认的自增主键(AutoField)是在对象被写入数据库之后才会被分配值的。当你用form.save(commit=False)时,对象只是在内存中创建了,还没跟数据库交互,自然没有ID。
那怎么解决呢?其实很直接,先把对象保存到数据库拿到ID,再更新desc字段就好:
class Post(CreateView): # 如果desc是自动赋值的,就不用放在fields里啦 fields = ('title',) model = models.Post def form_valid(self, form): # 先完整保存对象到数据库,获取ID self.object = form.save() # 现在ID已经存在了,赋值给desc self.object.desc = str(self.object.id) # 注意如果desc是字符串类型,要转成字符串 # 只更新desc字段,避免不必要的字段写入 self.object.save(update_fields=['desc']) # 调用父类的form_valid完成后续流程 return super().form_valid(form)
额外提醒:
- 如果你的
desc字段在模型里设置了blank=False(必填),记得要么把它改成blank=True,要么从表单的fields里移除(就像上面的代码那样),不然表单提交时会因为desc为空而报错。 - 使用
update_fields参数只会更新指定字段,比直接save()更高效,尤其是当模型字段较多的时候。
内容的提问来源于stack exchange,提问作者Budi Gunawan
相关产品推荐
相关产品推荐

