Django重写Meeting模型save方法后生成两条不同ID会议记录问题
问题根源
你在MeetingsCreate视图的form_valid方法里重复触发了两次保存逻辑:
- 你手动写的
self.object = form.save()是第一次调用Meeting的save方法,生成第一条会议记录 - 末尾
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
相关产品推荐
相关产品推荐

