Django中NestedHyperlinkedModelSerializer外键返回链接而非ID如何处理
问题原因
你使用的NestedHyperlinkedModelSerializer继承自超链接系列序列化器,默认会自动将外键字段映射为超链接类型的序列化字段,所以直接在fields中添加client_id时,返回的是关联资源的url而非数据库存储的数字ID。
解决方案
直接在MailDropSerializer中显式覆盖client_id字段的序列化规则,指定为整数类型即可,修改后的序列化器代码如下:
from rest_framework import serializers class MailDropSerializer(NestedHyperlinkedModelSerializer): parent_lookup_kwargs = { 'client_pk': 'client_id', } # 显式指定client_id为IntegerField,直接读取外键存储的ID值 client_id = serializers.IntegerField() class Meta: model = MailDrop fields = ['id', 'title', 'client_id']
修改完成后不需要改动其他逻辑,你已经传入的context参数可以保留,接口将直接返回数字类型的client_id,符合你的预期格式。
可选替代方案
如果你不想显式定义字段,也可以直接使用Django外键字段默认生成的_id后缀属性,将client_id_id加入fields列表,同时可以通过source参数自定义返回的字段名:
class MailDropSerializer(NestedHyperlinkedModelSerializer): parent_lookup_kwargs = { 'client_pk': 'client_id', } client_id = serializers.IntegerField(source='client_id_id') class Meta: model = MailDrop fields = ['id', 'title', 'client_id']
内容的提问来源于stack exchange,提问作者Manan
相关产品推荐
相关产品推荐

