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

