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

Django排班添加多用户报错:Field 'id' expected a number but got ['1', '2']

解决Attendance模型关联多个用户的报错问题

你遇到的报错核心原因是Attendance模型的user字段用了ForeignKey,这是一对多关系——一个Attendance只能绑定一个User,但你提交了多个用户ID的数组(比如['1','2']),Django期望接收单个数字ID,自然会抛出类型不匹配的错误,和转不转字符串没关系。

下面给两种针对性解决方案:

方案1:修改模型为多对多关联(推荐,匹配业务逻辑)

如果你的业务需求就是「一个班次对应多个用户」,直接把ForeignKey改成ManyToManyField是最合理的:

1. 更新models.py

from django.db import models
from django.contrib.auth.models import User

class Attendance(models.Model):
    # 替换原ForeignKey为ManyToManyField
    user = models.ManyToManyField(User, related_name='attendances')
    shift = models.ForeignKey(Shift, on_delete=models.CASCADE)  # 假设你有Shift班次模型
    # 其他业务字段(比如考勤日期、状态等)...

2. 执行数据库迁移

python manage.py makemigrations
python manage.py migrate

3. 修改视图处理逻辑

前端提交的多个user_id会是一个列表,视图里用add()方法批量添加关联:

from django.shortcuts import redirect
from .models import Attendance, Shift

def add_attendance(request):
    if request.method == 'POST':
        shift_id = request.POST.get('shift_id')
        user_ids = request.POST.getlist('user_ids')  # 获取多选的用户ID列表
        shift = Shift.objects.get(id=shift_id)
        
        # 创建班次考勤记录,再绑定多个用户
        attendance = Attendance.objects.create(shift=shift)
        attendance.user.add(*user_ids)  # 用*解包列表传参
        
        return redirect('attendance_list')

4. 前端表单示例

用支持多选的控件,比如带multiple属性的下拉框,或者多选复选框:

<form method="post" action="{% url 'add_attendance' %}">
    {% csrf_token %}
    <!-- 选择班次 -->
    <select name="shift_id">
        {% for shift in shifts %}
            <option value="{{ shift.id }}">{{ shift.name }}</option>
        {% endfor %}
    </select>
    
    <!-- 多选用户:下拉框版本 -->
    <select name="user_ids" multiple>
        {% for user in users %}
            <option value="{{ user.id }}">{{ user.username }}</option>
        {% endfor %}
    </select>
    
    <!-- 多选用户:复选框版本(更直观) -->
    {% for user in users %}
        <label>
            <input type="checkbox" name="user_ids" value="{{ user.id }}">
            {{ user.username }}
        </label>
    {% endfor %}
    
    <button type="submit">保存班次考勤</button>
</form>

方案2:保持ForeignKey,批量创建单条关联记录

如果不想修改模型(比如业务上要求「每个用户对应单独的考勤记录」),可以循环用户ID,为每个用户创建一条Attendance记录:

修改视图逻辑

def add_attendance(request):
    if request.method == 'POST':
        shift_id = request.POST.get('shift_id')
        user_ids = request.POST.getlist('user_ids')
        shift = Shift.objects.get(id=shift_id)
        
        # 循环为每个用户创建单独的考勤记录
        for user_id in user_ids:
            Attendance.objects.create(
                user_id=user_id,  # 直接通过user_id赋值外键
                shift=shift
                # 其他字段(比如考勤状态)赋值...
            )
        
        return redirect('attendance_list')

前端表单和方案1一致,无需改动。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 05:30:59