
本文旨在解决django应用中,当html多选表单提交多个用户id给一个`foreignkey`字段时,由于`foreignkey`期望单个id而实际接收到id列表所导致的错误。我们将深入探讨如何利用django的`bulk_create`方法,高效地为每个选定的用户创建独立的数据库记录,从而优雅地处理一对多关系中的批量数据插入需求。
理解ForeignKey与多选输入的冲突
在Django中,ForeignKey字段用于建立一对多关系,意味着一个子模型实例只能关联到一个父模型实例。例如,在提供的代码中,Attendance模型通过user = models.ForeignKey(User, ...)关联到User模型,表示每一次考勤记录(Attendance)都只属于一个特定的用户(User)。
然而,前端表单使用了
问题在于,Attendance.objects.create()方法在尝试将这个ID列表直接赋值给user_id字段时,ForeignKey字段期望的是一个单一的数字ID,而不是一个列表。这便导致了经典的错误信息:Field 'id' expected a number but got ['1', '2']。
原始代码片段回顾:
-
models.py

class User(models.Model): user_name = models.CharField(max_length=32, unique=True) # ... 其他字段 class Attendance(models.Model): RosteringUserDate = models.ForeignKey('RosteringUserDate', on_delete=models.CASCADE, null=True) date = models.DateField() user = models.ForeignKey(User, on_delete=models.CASCADE) # ForeignKey 字段 begin_time = models.TimeField(default="") end_time = models.TimeField(default="") work_time = models.CharField(max_length=64, default='')登录后复制
-
views.py中导致错误的部分
def shift_add(request): # ... if request.method == "POST": # 这里尝试将列表赋值给单个ForeignKey字段,导致错误 Attendance.objects.create( user_id = request.POST.getlist('user_name',[]), # 错误根源 date = request.POST.get('date'), RosteringUserDate_id = request.POST.get('RosteringUserDate_id'), begin_time = request.POST.get('begin_time'), end_time = request.POST.get('end_time'), work_time = request.POST.get('work_time'), ) return redirect('/user/attendance/')登录后复制
解决方案:使用Django的bulk_create进行批量创建
解决此问题的核心思路是:当用户选择了多个用户时,我们需要为每个选中的用户创建一条独立的Attendance记录。Django提供了bulk_create方法,可以高效地批量创建多个模型实例,而无需为每个实例单独执行数据库插入操作,这大大提高了性能。
修改views.py实现批量创建:
标签: html 前端 go cad app 后端 django 表单提交 red
还木有评论哦,快来抢沙发吧~