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

Django重写Meeting模型save方法后生成两条不同ID会议记录问题

问题根源

你在MeetingsCreate视图的form_valid方法里重复触发了两次保存逻辑:

  1. 你手动写的self.object = form.save()是第一次调用Meeting的save方法,生成第一条会议记录
  2. 末尾return super(MeetingsCreate, self).form_valid(form)调用了父类CreateView的原生form_valid方法,这个方法默认也会执行一次form.save(),就触发了第二次保存,生成了第二条仅ID不同的重复记录。

修复方案

1. 修正视图的form_valid逻辑

把最后调用父类form_valid的逻辑替换为直接跳转,避免父类重复执行保存操作,修改后代码如下:

# 先在views.py顶部导入跳转类
from django.http import HttpResponseRedirect

def form_valid(self, form):
    context = self.get_context_data()
    meetings = context['meetings']
    with transaction.atomic():
        self.object = form.save()
        if meetings.is_valid():   
            meetings.instance = self.object
            meetings.save()
    # 直接跳转到成功页,不再调用父类的form_valid
    return HttpResponseRedirect(self.get_success_url())

2. 优化Meeting模型的save方法(可选但强烈建议)

你当前的save方法存在两个隐患:

  • 如果随机生成的6位ID刚好和已有的ID重复,本次保存会直接失败没有重试机制
  • 后续更新会议信息时,会重新生成ID导致关联的会议决议找不到对应会议

可以修改为以下逻辑:

def save(self, *args, **kwargs):
    # 仅新建对象、还没有ID的时候才生成随机ID
    if not self.meeting_ID:
        # 加循环确保一定能拿到不重复的ID再执行保存
        while True:
            meetingID = random.randint(100000,999999)
            if not Meeting.objects.filter(meeting_ID=str(meetingID)).exists():
                self.meeting_ID = str(meetingID)
                break
    # 不管是新建还是更新,最终都要调用父类save方法,不要把super放在ID判断分支里
    super(Meeting, self).save(*args,**kwargs)

内容的提问来源于stack exchange,提问作者azril

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 09:36:00