You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:14:07