Django Form工厂 和 批量创建数据

Django Form工厂 和 批量创建数据

modelformset_factory

  • 应用于大量数据需要修改,在页面生成修改数据页面,并直接修改保存

  • 后端代码

    # 1. 生成 ModelFormSet 工厂类  
    # - extra:设定是否留有空白添加项
    # - 绑定模型 和 Form模型
    ModelFormSet = modelformset_factory(StudyRecord, StudyRecordForm, extra=0)
    
    # 2. 生成 ModelFormSet 工厂对象
    # - queryset 将 ORM数据
    form_set_obj = ModelFormSet(queryset=study_record_query_set.order_by('id')[pm_obj.start:pm_obj.end])
    
    # 3. 通过 form_set_obj 对象进行校验和批量保存
    # - data 请求数据
    form_set_obj = ModelFormSet(queryset=study_record_query_set.order_by('id')[pm_obj.start:pm_obj.end],
                                        data=request.POST)
    # 数据校验和保存
    if form_set_obj.is_valid():
                form_set_obj.save()
    
    
  • 前端代码

    // 后端代码
    return render(request, 'study_record/study_record_list.html', {
            "form_set_obj": form_set_obj,
            "page_html": pm_obj.page_to_html()
        })
    
    // 1. 加载 formset 工厂对象
     {{ form_set_obj.management_form }}
    
    // 2. 循环 formset
    {% for form in form_set_obj %}
    <tr>
    	{{ form.id }}  // 必须要写
        <td><input type="checkbox"></td>
        <td>{{ forloop.counter }}</td>
        <td>{{ form.instance.student }}</td>
        <td>{{ form.attendance }}</td>
        <td>{{ form.score }}</td>
        <td>{{ form.homework_note }}</td>
        <td class="hidden">{{ form.course_record }}</td>
        <td class="hidden">{{ form.student }}</td>
    </tr>
    {% endfor %}
    

批量创建数据 bulk_create

  • bulk_create , 以对象的形式创建多条数据

  • 代码:

    def multi_init(self):
        """
            批量创建学习记录 , 涉及模型:课程记录,学生用户,学习记录三个模型
        :return:
        """
        # 课程记录, 批量创建 学生的 学习记录
        course_record_ids = self.choice_ids
    
        # 查询所有课程记录对象
        course_record_objs = CourseRecord.objects.filter(pk__in=course_record_ids)
    
        # 遍历所有课程记录
        for each_course_record in course_record_objs:
            # 通过课程绑定的班级,再从班级获取该班级下所有的学生
            # : customer_set 反向查询
            student_objs = each_course_record.re_class.customer_set.all().filter(status='studying')
    
            study_record_bulk_list = []
            for each_student in student_objs:
                # 每一个学生,当前课程记录是否存在,不存在则创建
                if not StudyRecord.objects.filter(course_record=each_course_record,
                                                  student=each_student).exist():
                    study_record_bulk_list.append(StudyRecord(course_record=each_course_record, student=each_student))
            StudyRecord.objects.bulk_create(study_record_bulk_list, batch_size=100)
    
posted @   染指未来  阅读(76)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示