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

如何在单个Django视图中序列化Offre与Recruteur多模型?

解决方案:在单个Django视图中序列化关联的Offre和Recruteur模型

要在同一个视图里同时序列化这两个关联模型的数据,最简洁的方式是把Recruteur的序列化器嵌套到Offre的序列化器中,这样返回的响应会自动包含Offre及其关联的Recruteur信息。下面是具体实现步骤:

1. 更新OffreSerializer,添加嵌套序列化器

你已经有了RecruteurByIdSerializer,直接把它作为字段加到OffreSerializer里即可,注意指定source来关联外键字段:

class OffreSerializer(serializers.ModelSerializer):
    # 嵌套Recruteur序列化器,自动带出关联的企业名称
    recruteur = RecruteurByIdSerializer(source='idRecruteur', read_only=True)

    class Meta:
        model = Offre
        # 这里加入你需要的Offre自有字段,再加上嵌套的recruteur字段
        fields = ('id', '你的其他Offre字段', 'recruteur')

小说明:

  • source='idRecruteur'指定该字段对应Offre模型里的外键字段idRecruteur
  • read_only=True表示这个字段仅用于序列化输出,创建/更新Offre时不需要传入该字段

2. 编写视图,返回包含关联数据的响应

你可以用DRF的通用视图或者自定义APIView实现,这里给出两种常用方式:

方式一:用RetrieveAPIView(快速实现单条数据查询)

from rest_framework.generics import RetrieveAPIView

class OffreDetailView(RetrieveAPIView):
    queryset = Offre.objects.all()
    serializer_class = OffreSerializer

访问该视图的URL后,返回的JSON结构会是这样:

{
  "id": 1,
  "你的其他Offre字段": "对应内容",
  "recruteur": {
    "entrepriseName": "目标企业名称"
  }
}

方式二:用APIView(自定义逻辑更灵活)

如果需要额外的过滤、权限校验等逻辑,用APIView更合适:

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status

class OffreDetailView(APIView):
    def get(self, request, pk):
        try:
            offre = Offre.objects.get(pk=pk)
            serializer = OffreSerializer(offre)
            return Response(serializer.data, status=status.HTTP_200_OK)
        except Offre.DoesNotExist:
            return Response({"error": "该Offre不存在"}, status=status.HTTP_404_NOT_FOUND)

3. 扩展:返回多个Offre及其关联Recruteur

如果需要返回列表数据,只需把RetrieveAPIView换成ListAPIView,或者在APIView里用Offre.objects.all()查询全部数据,序列化后返回即可,最终会得到一个包含多个Offre对象的数组,每个对象都带有对应的recruteur字段。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:43:09