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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 20:25:19