Django一对多查询结果序列化与前端Ajax展示

Aria
Aria
发布时间:2026-10-13| 4人浏览过
原创

本文详解在Django中如何处理一对多模型查询结果,解决QuerySet无法直接序列化的问题。通过遍历对象转换为字典列表,利用JsonResponse的safe=False参数实现后端数据输出,并结合前端jQuery Ajax接收数据,动态渲染HTML列表展示学生信息。

Django一对多模型关系与数据查询

以一对多的数据表关系为例,学生属于“多”的一方,老师属于“一”的一方。在模型定义中,外键字段允许为空(null=True),这意味着即使关联的老师记录被删除,对应的学生记录依然保留,只是外键字段值变为空。


class Teacher(models.Model):
  name = models.CharField(max_length=10,verbose_name='老师名称')
  password = models.CharField(max_length=10,verbose_name='密码')
  class Meta:
    verbose_name_plural = '教师表'
  def __str__(self):
    return self.name
class Student(models.Model):
  teacher = models.ForeignKey(to=Teacher,on_delete=models.SET_NULL,null=True,verbose_name='教师')
  name = models.CharField(max_length=10,verbose_name='学生名字')
  age = models.IntegerField(verbose_name='年龄')
  class Meta:
    verbose_name_plural = '学生表'
  def __str__(self):
    return self.name

获取特定老师及其名下学生的代码如下: ``` teacher = models.Teacher.objects.get(pk=id) # 获取id对应的老师对象 students = teacher.student_set.all() # 利用反向关系查询该老师下的所有学生 ```

执行上述代码后,all()方法返回的是一个QuerySet结果集,示例输出如下:<QuerySet [<Student: 学生1>, <Student: 学生22>, <Student: 3>, <Student: 44>]>。

若需将该结果集通过Ajax传递给前端,通常需要转换为JSON格式。然而,Django默认的json.dumps或直接返回QuerySet会引发错误,因为QuerySet对象无法直接被标准JSON序列化器处理。

解决思路是先将QuerySet转换为列表嵌套字典的结构,再对其进行序列化操作,从而生成前端可解析的数据格式。

后端数据序列化与JSON响应处理


def index(request):
  if request.method == "GET":
    teacher_name = request.session.get('name')
    teacher = models.Teacher.objects.get(name=teacher_name)
    students = teacher.student_set.all()
    print(students)
    list = []
    for i in students:
      json_dict = {}
      json_dict['name'] = i.name
      json_dict['age'] = i.age
      list.append(json_dict)
    return JsonResponse(list,safe=False)  # 这里safe默认为True,只接受参数为dict字典类型,非dict类型---“报错:In order to allow non-dict objects to be serialized set the safe parameter to False.” safe=False之后list列表, tuple元祖, set集合就都可以

前端通过Ajax接收后端返回的参数,并使用循环遍历当前传递过来的列表数据,以便进行后续处理。

前端Ajax交互与动态渲染实现


$('#submit2').click(function(){
      $.ajax({
        url:'/app1/index/',
        type:'GET',
        success:function(res){
          console.log(res)
          var str = ''
          for(var i = 0; i < res.length; i++){     # js中的for循环
            str += '<li>' + res[i]['name'] + '</li>'
            }
            $('#students').html(str)          
        }
      })      

    })

最终的前端渲染效果如图所示,数据成功展示在页面上。

前端HTML结构包含一个触发按钮和一个用于显示结果的段落标签: ``` <button id="submit2">点击查看我的学生</button> <p id="students"></p> ```

看似简单的按钮点击操作,背后涉及了后端数据查询、序列化转换以及前端异步请求与DOM更新等多个环节,最终使得信息成功展示在下方标签中。

这一过程说明,看似简单的功能实现背后隐藏着复杂的技术细节,每个环节都至关重要。

以上就是本文关于Django数据序列化与Ajax展示的全部内容,希望对相关学习有所帮助,欢迎继续支持本站获取更多技术资源。

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。