Django REST Framework中外键字段仅返回ID而非名称值的解决咨询
解决Django REST Framework中外键字段仅返回ID的问题
下面是几种常用的解决方法,按需选择即可:
方法1:使用StringRelatedField
如果外键模型(比如Country)已经在__str__方法中返回名称字段,直接用这个字段就能获取名称:
# serializer.py from rest_framework import serializers from .models import State, Country class StateSerializer(serializers.ModelSerializer): # 直接返回Country对象__str__方法的返回值 country = serializers.StringRelatedField() class Meta: model = State fields = ('id', 'name', 'country')
前提是Country模型的__str__要返回名称:
# models.py class Country(models.Model): name = models.CharField(max_length=100) def __str__(self): return self.name
方法2:使用SlugRelatedField
直接指定要返回的外键模型字段,无需依赖__str__方法:
# serializer.py class StateSerializer(serializers.ModelSerializer): country = serializers.SlugRelatedField(read_only=True, slug_field='name') class Meta: model = State fields = ('id', 'name', 'country')
这里的slug_field='name'表示返回Country模型中name字段的值。
方法3:嵌套序列化器
如果需要返回外键对象的多个字段(比如同时返回ID和名称),可以用嵌套序列化器:
# serializer.py class CountrySerializer(serializers.ModelSerializer): class Meta: model = Country fields = ('id', 'name') class StateSerializer(serializers.ModelSerializer): country = CountrySerializer(read_only=True) class Meta: model = State fields = ('id', 'name', 'country')
此时返回的country字段会是一个包含id和name的字典。
方法4:单独添加名称字段(保留原外键ID)
如果需要同时保留外键ID和显示名称,可以新增一个字段:
# serializer.py class StateSerializer(serializers.ModelSerializer): country_name = serializers.CharField(source='country.name', read_only=True) class Meta: model = State fields = ('id', 'name', 'country', 'country_name')
这样返回的结果里既有country(ID),又有country_name(名称)。
内容的提问来源于stack exchange,提问作者Jyoti
相关产品推荐
相关产品推荐

