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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:25:24