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
相关产品推荐
相关产品推荐

