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

Django Rest Framework跨应用模型序列化关联实现方案咨询

如何在Django Rest Framework(v3.14)中实现跨应用关联模型的嵌套序列化?

问题背景

我有两个分属不同应用的模型:

App1中的Model1模型

class Model1(models.Model):
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)
    barcode = models.CharField(max_length=100, unique=True, blank=False, null=False)
    shortname = models.CharField(max_length=50, blank=False, null=False)

App2中的Items模型

class Items(models.Model):
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)
    transno = models.CharField(max_length=100, blank=True, null=True)
    barcode = models.ForeignKey("app1.Model1", to_field="barcode", db_column="barcode", on_delete=models.CASCADE, related_name="app2_items")

希望在GET请求时返回如下格式的结果:

[
    {
        "created": "2023-05-26 00:00:00",
        "updated": "2023-05-26 00:00:00",
        "transno": "123456",
        "model1": {
            "created": "2023-05-26 00:00:00",
            "updated": "2023-05-26 00:00:00",
            "barcode": "123134",
            "shortname": ""
        }
    }
]

解决方案

通过嵌套序列化器即可实现需求,步骤如下:

1. 定义Model1的序列化器

在App1的serializers.py中创建序列化器,用于序列化关联的Model1数据:

# app1/serializers.py
from rest_framework import serializers
from .models import Model1

class Model1Serializer(serializers.ModelSerializer):
    class Meta:
        model = Model1
        fields = ['created', 'updated', 'barcode', 'shortname']

2. 定义Items的序列化器

在App2的serializers.py中创建序列化器,使用上述Model1Serializer将关联的barcode字段转为嵌套的model1结构:

# app2/serializers.py
from rest_framework import serializers
from .models import Items
from app1.serializers import Model1Serializer

class ItemsSerializer(serializers.ModelSerializer):
    # 指定source为关联字段barcode,将其序列化为嵌套的model1结构
    model1 = Model1Serializer(source='barcode')

    class Meta:
        model = Items
        fields = ['created', 'updated', 'transno', 'model1']

3. 配置视图(示例)

如果使用基于类的视图,比如ListAPIView,可以这样配置:

# app2/views.py
from rest_framework import generics
from .models import Items
from .serializers import ItemsSerializer

class ItemsListView(generics.ListAPIView):
    # 用select_related预加载关联数据,避免N+1查询性能问题
    queryset = Items.objects.all().select_related('barcode')
    serializer_class = ItemsSerializer

访问该视图的GET接口时,即可返回你需要的嵌套格式数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 00:07:34