Django 1.11.2中如何让Design API返回关联Pattern数组?
解决Django REST Framework中Design关联Pattern数组返回的问题
嘿,针对你的需求,我来一步步帮你实现让API返回每个Design关联的Pattern数组:
1. 优化多对多关联的反向命名(可选但推荐)
你的Pattern模型里用了ManyToManyField关联Design,Django默认会给Design生成一个反向关联属性pattern_set,但我们可以自定义一个更直观的名字,方便后续调用。修改Pattern模型:
from django.db import models from datetime import date from designs.models import Design class Pattern(models.Model): # 添加related_name='patterns',这样Design实例可以直接用.design.patterns访问关联的Pattern design_id = models.ManyToManyField(Design, related_name='patterns') name = models.CharField(max_length=200) def __str__(self): return self.name
2. 修正Design序列化器
你当前的DesignsSerializer里引用了DesignPatternSerializer但没有定义它,我们直接用已有的PatternSerializer来序列化关联的Pattern数组即可。修改Design的序列化器:
from rest_framework import serializers from .models import Design from patterns.serializers import PatternSerializer # 导入Pattern的序列化器 class DesignsSerializer(serializers.ModelSerializer): # 使用PatternSerializer来序列化关联的patterns,many=True表示是数组 patterns = PatternSerializer(read_only=True, many=True) class Meta: model = Design # 保留你需要的字段,加上patterns fields = ('id', 'name', 'product_id', 'price', 'patterns') read_only_fields = ('id',) # 根据实际需求调整只读字段,name和patterns如果需要修改可以去掉只读
3. 验证视图逻辑
你的ListDesignsByProducId视图已经正确过滤了指定product_id的Design,现在序列化器会自动把每个Design关联的Pattern数组序列化进去,不需要额外修改视图:
from django.shortcuts import render from .models import Design from .serializers import DesignsSerializer from rest_framework import generics, filters class ListDesignsByProducId(generics.ListCreateAPIView): serializer_class = DesignsSerializer def get_queryset(self): return Design.objects.filter(product_id__exact = self.kwargs.get('product_id'))
额外提示
- 你的Design模型里的
product_id字段是ForeignKey,按照Django的命名规范,建议改成product(Django会自动在数据库生成product_id列),这样代码更易读:product = models.ForeignKey(Product, on_delete=models.CASCADE) - 如果不需要返回Product的详情,可以去掉序列化器里的
depth=1,或者根据需求调整序列化的深度
这样修改后,你的API返回的每个Design对象里就会包含一个patterns数组,里面是该Design关联的所有Pattern的详情啦!
内容的提问来源于stack exchange,提问作者harikrish
相关产品推荐
相关产品推荐

