Django REST Framework中外键字段如何显示名称而非ID
Django REST Framework 外键字段返回名称而非ID的解决方案
我在Django应用中使用DRF构建API,现有外键关联的模型,API返回的是外键ID,但我需要返回关联模型的名称。相关代码如下:
模型字段
category = models.ForeignKey(Category, related_name='animals', on_delete=models.CASCADE, verbose_name="test")
序列化器
class SubAnimalSerializer(serializers.ModelSerializer): class Meta: model = Animal fields = ['id', 'name', 'description',"category","pet_list", 'images' ] read_only_fields = ['id']
当前API返回示例
"animals": [ { "id": 3, "name": "Vicuña", "description": "kjhkkhkhkjhjkhj Hello", "category": 6, "pet_list": "D", "images": "http://192.168.1.135:8000/media/media/photos/animals/mammal.jpg" }, { "id": 5, "name": "Goudhamster", "description": "khkjh", "category": 6, "pet_list": "C", "images": "http://192.168.1.135:8000/media/media/photos/animals/imgbin_dog-grooming-puppy-cat-pet-png_I7rLPen.png" } ]
方法1:用StringRelatedField快速实现(推荐)
如果你的Category模型已经定义了__str__方法,且返回的就是需要显示的名称(比如def __str__(self): return self.name),直接用这个字段最省事:
class SubAnimalSerializer(serializers.ModelSerializer): category = serializers.StringRelatedField() # 新增该行 class Meta: model = Animal fields = ['id', 'name', 'description',"category","pet_list", 'images' ] read_only_fields = ['id']
这个字段默认只读,会直接调用关联模型的__str__返回结果。
方法2:用SerializerMethodField自定义返回内容
如果需要返回的不是__str__的内容,或者要做额外逻辑处理,用这个方法更灵活:
class SubAnimalSerializer(serializers.ModelSerializer): category = serializers.SerializerMethodField() def get_category(self, obj): # 这里返回Category模型的name字段,根据你的实际字段名调整 return obj.category.name class Meta: model = Animal fields = ['id', 'name', 'description',"category","pet_list", 'images' ] read_only_fields = ['id']
get_<字段名>方法接收当前Animal对象作为参数,你可以在这里自由定义返回值,比如拼接多个字段、处理空值等。
方法3:嵌套序列化器(返回多字段关联数据)
如果需要返回关联模型的多个字段(比如同时返回ID和名称),可以定义一个简易的嵌套序列化器:
class CategorySerializer(serializers.ModelSerializer): class Meta: model = Category fields = ['id', 'name'] # 按需添加需要返回的字段 class SubAnimalSerializer(serializers.ModelSerializer): category = CategorySerializer(read_only=True) class Meta: model = Animal fields = ['id', 'name', 'description',"category","pet_list", 'images' ] read_only_fields = ['id']
这种方式会返回一个包含Category多字段的对象,比如{"id":6, "name":"哺乳动物"},适合需要更多关联信息的场景。
内容的提问来源于stack exchange,提问作者mightycode Newton
相关产品推荐
相关产品推荐

