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

Django中如何获取ForeignKey外键关联字段的实际值而非主键id

解决方案

你当前遇到的问题是Django REST Framework默认序列化外键字段时会返回关联表的主键ID,只需要修改VariantSerializer序列化器即可实现返回colorName,下面是几种常用方案:

方案1:使用StringRelatedField(最简单)

因为你的Color模型已经定义了__str__方法返回colorName,直接指定外键字段为StringRelatedField即可:

# 你的VariantSerializer定义处修改如下
from rest_framework import serializers
from .models import Variant

class VariantSerializer(serializers.ModelSerializer):
    color = serializers.StringRelatedField(read_only=True)
    
    class Meta:
        model = Variant
        fields = "__all__" # 也可以自定义需要返回的字段列表

该方案返回的color字段直接为colorName字符串,无需额外配置。

方案2:嵌套Color序列化器(适合需要返回Color多个字段的场景)

如果后续还需要返回Color表的其他字段,可以单独定义Color的序列化器嵌套使用:

from rest_framework import serializers
from .models import Variant, Color

class ColorSerializer(serializers.ModelSerializer):
    class Meta:
        model = Color
        fields = ["colorName"] # 需要其他Color字段直接添加到列表即可

class VariantSerializer(serializers.ModelSerializer):
    color = ColorSerializer(read_only=True)
    
    class Meta:
        model = Variant
        fields = "__all__"

该方案返回的color是一个对象,结构为{"colorName": "xxx"}。

方案3:使用SerializerMethodField(灵活度最高)

如果需要自定义字段名或者做额外逻辑处理,可以用自定义字段实现:

from rest_framework import serializers
from .models import Variant

class VariantSerializer(serializers.ModelSerializer):
    # 自定义返回字段名为colorName
    colorName = serializers.SerializerMethodField()
    
    class Meta:
        model = Variant
        # 原color字段可以保留也可以删除,按需配置
        fields = ["id", "product", "image", "colorName"]
    
    def get_colorName(self, obj):
        # 增加判空逻辑避免color为null时报错
        return obj.color.colorName if obj.color else None

额外性能优化建议

你可以在视图查询Variant时添加select_related提前加载关联的color数据,避免出现N+1数据库查询问题,修改视图代码如下:

@api_view(['GET'])
def getProduct(request, pk):
    product = Product.objects.get(_id=pk)
    # 增加select_related预加载color关联数据
    variants = Variant.objects.filter(product=product).select_related('color')
    productserializer = ProductSerializer(product, many=False)
    variantserializer = VariantSerializer(variants,many=True)
    data = {'product_details':productserializer.data,'product_variants':variantserializer.data}
    print(data)
    return Response(data)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 05:24:03