Django中处理多选用户与ForeignKey的批量创建问题

admin 百科 12

Django中处理多选用户与ForeignKey的批量创建问题

本文旨在解决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

    Django中处理多选用户与ForeignKey的批量创建问题-第2张图片-佛山资讯网

    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

发布评论 0条评论)

还木有评论哦,快来抢沙发吧~