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

Django多对多关联模型下学生表单取模块列表及关联查询方法

问题1:新增学生表单获取全量Module并实现关联

你定义的多对多关联字段在Module模型侧,Django会自动为Student生成反向关联能力,按以下步骤操作即可:

  1. 定义Student表单时,新增Module多选字段,自动加载全量已有Module:
from django import forms
from .models import Student, Module

class StudentAddForm(forms.ModelForm):
    # 自动查询所有Module作为可选项
    selected_modules = forms.ModelMultipleChoiceField(
        queryset=Module.objects.all(),
        widget=forms.CheckboxSelectMultiple, # 复选框形式更适合多选,可按需替换组件
        label="选修课程"
    )
    class Meta:
        model = Student
        fields = ["student_id", "name", "birthday"]
  1. 视图层保存表单时,手动写入多对多关联:
def add_student(request):
    if request.method == "POST":
        form = StudentAddForm(request.POST)
        if form.is_valid():
            # 先保存学生基础信息
            student = form.save()
            # 关联选中的Module
            student.module_set.add(*form.cleaned_data["selected_modules"])
            return redirect("student_list") # 替换为你自己的跳转路由名
    else:
        form = StudentAddForm()
    return render(request, "add_student.html", {"form": form})

问题2:查询学生关联的所有Module

无需修改现有模型的查询方式

直接用Django默认生成的反向关联属性module_set查询即可:

# 先获取指定学生的实例
student = Student.objects.get(student_id="0001")
# 查询关联的所有Module
student_modules = student.module_set.all()

语义化优化方案(可选)

可以调整Module模型的多对多字段配置,添加related_name参数自定义反向关联名称,使用更直观:

class Module(models.Model):
    name = models.CharField(max_length=150)
    code = models.IntegerField()
    # 添加related_name参数
    student = models.ManyToManyField(Student, related_name="enrolled_modules")

修改后查询代码可简化为:

student_modules = student.enrolled_modules.all()

模板页面展示示例

将查询到的数据集传到模板后,循环渲染即可:

<div>
  <h3>{{ student.name }}的选修课程</h3>
  <ul>
    {% for mod in student_modules %}
    <li>课程名称:{{ mod.name }} / 课程代码:{{ mod.code }}</li>
    {% empty %}
    <li>暂无选修课程</li>
    {% endfor %}
  </ul>
</div>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 01:15:07