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

在Django REST Framework中HyperlinkedModelSerializer无法获取外键值

解决Django REST Framework HyperlinkedModelSerializer无法获取外键对应值的问题

我猜你遇到的是HyperlinkedModelSerializer默认对外键字段只返回关联资源URL,而拿不到你想要的具体字段值的问题吧?我来一步步帮你搞定这个问题。

首先先补全一下我推测的Vendor模型外键字段(你提供的代码没写完),假设你的Vendor模型里有一个关联BusinessType的外键:

class Vendor(models.Model):
    first_name = models.CharField(max_length=25)
    middle_name = models.CharField(max_length=25)
    last_name = models.CharField(max_length=25)
    nick_name = models.CharField(max_length=10)
    email = models.CharField(max_length=30)
    company = models.CharField(max_length=25)
    phone = models.CharField(max_length=15)
    mobile = models.CharField(max_length=10)
    fax = models.CharField(max_length=15)  # 补全未写完的字段
    business_type = models.ForeignKey(BusinessType, on_delete=models.CASCADE, related_name='vendors')

接下来分两种场景给你解决方案:

场景1:同时获取外键的URL和具体字段值

如果你既想要外键对应的资源URL,又想拿到关联对象的具体字段(比如BusinessType的method),可以通过嵌套序列化器实现:

from rest_framework import serializers
from .models import Vendor, BusinessType

class BusinessTypeSerializer(serializers.ModelSerializer):
    class Meta:
        model = BusinessType
        fields = ('id', 'method')

class VendorSerializer(serializers.HyperlinkedModelSerializer):
    # 嵌套序列化器,从外键对象中读取具体字段
    business_type_details = BusinessTypeSerializer(source='business_type', read_only=True)
    
    class Meta:
        model = Vendor
        fields = ('url', 'first_name', 'middle_name', 'last_name', 'nick_name', 'email', 'company', 'phone', 'mobile', 'fax', 'business_type', 'business_type_details')

这样返回的Vendor数据里,business_type是关联BusinessType的URL,business_type_details会包含对应的id和method字段值。

场景2:只获取外键的具体字段值,不需要URL

如果你不需要外键的URL,只想要关联对象的具体字段内容,有两种简单方法:

方法A:用StringRelatedField

class VendorSerializer(serializers.HyperlinkedModelSerializer):
    business_type = serializers.StringRelatedField()
    
    class Meta:
        model = Vendor
        fields = ('url', 'first_name', 'middle_name', 'last_name', 'nick_name', 'email', 'company', 'phone', 'mobile', 'fax', 'business_type')

注意:这需要你给BusinessType模型定义__str__方法,让它返回你想要展示的字段:

class BusinessType(models.Model):
    method = models.CharField(max_length=25)
    
    def __str__(self):
        return self.method

方法B:直接指定字段来源获取单个值

如果你只需要BusinessType的method字段,不想返回整个对象信息,可以直接指定字段来源:

class VendorSerializer(serializers.HyperlinkedModelSerializer):
    business_method = serializers.CharField(source='business_type.method', read_only=True)
    
    class Meta:
        model = Vendor
        fields = ('url', 'first_name', 'middle_name', 'last_name', 'nick_name', 'email', 'company', 'phone', 'mobile', 'fax', 'business_method')

这样返回的business_method就是对应BusinessType的method值。

为啥默认拿不到外键值?

HyperlinkedModelSerializer默认会把外键字段序列化为HyperlinkedRelatedField,也就是只返回关联资源的URL,而不是具体字段内容。所以需要我们手动指定字段的序列化方式,才能拿到想要的结果。

内容的提问来源于stack exchange,提问作者hari prasanth

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:49:17