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

