已扩展关系模型数据的Django查询集列表

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了已扩展关系模型数据的Django查询集列表相关的知识,希望对你有一定的参考价值。

在我的Django webapp中,我有基于功能的API,它显示了一个分页列表。问题是我希望列表中的每一行都有扩展的关系字段输出。

这是我出席的模式:

class Attendance(models.Model):
    CHECKIN = 1
    CHECKOUT = 2
    ATTENDANCE_TYPE_CHOICES = (
        (CHECKIN, "Check In"),
        (CHECKOUT, "Check Out"),
    )
    employee = models.ForeignKey(Employee)
    company = models.ForeignKey(Company)
    activity_type = models.IntegerField(choices = ATTENDANCE_TYPE_CHOICES, default=CHECKIN)

这是我的列表API的一部分,我在其中定义了我想要显示的字段并进行了分页。

employee_list = Employee.objects.filter(company = auth_employee.employee.company.id).values("id","employee","company","activity_type").order_by('id') 

page = request.GET.get('page', request.POST['page'])
paginator = Paginator(employee_list, request.POST['page_limit'])

try:
    employees = paginator.page(page)
except PageNotAnInteger:
    employees = paginator.page(request.POST['page'])
except EmptyPage:
    employees = paginator.page(paginator.num_pages)

return Response(list(employees), status=status.HTTP_200_OK)          

输出是这样的列表,但没有员工详细信息。

[
  {
    "id": 14,
    "employee": 15,
    "company": 15,
    "activity_type": 1,
  },
  {
    "id": 15,
    "employee": 15,
    "company": 15,
    "activity_type": 2,
  }
]

我的预期输出,我怎么得到这样的东西?

[
  {
    "id": 14,
    "employee": {
                 "id":"2",
                 "name":"Michael"
                },
    "company": 15,
    "activity_type": 1,
  },
  {
    "id": 15,
    "employee": {
                 "id":"2",
                 "name":"Jeniffer"
                },
    "company": 15,
    "activity_type": 2,
  }
]

如何生成一个列表,显示如上所示的关系数据以显示在json响应中?

答案

你所描述的是序列化,在这种情况下是嵌套序列化,其中django模型关系引用在上面描述的结构中被序列化。

使用django没有开箱即用的方法。 django-rest-framework项目用他们的nested serializers解决了这个问题

如果您正在处理将结果输出到JSON以供Django模板以外的某些服务或客户端使用的API,我会认真考虑将其添加到您的项目中。

以上是关于已扩展关系模型数据的Django查询集列表的主要内容,如果未能解决你的问题,请参考以下文章

无法在 graphene_django 中获取 OneToOne 关系查询的值

在 django 中获取具有多对多关系的复杂查询集

在 Django 中,正确地制作具有多个类别、多个标签和搜索的查询集?

Django - 使用 Q 跨越空关系的查询集

使用 django 查询集访问不同的外键关系

根据特定的多对多关系过滤 Django 查询集