Django HyperlinkedModelSerializer中ForeignKey传值报错求助
嘿,这个问题我之前也踩过坑!HyperlinkedModelSerializer默认是用对象的URL来关联外键的,你直接传数字ID字符串当然会报错啦~给你几个能保留外键关联、同时解决报错的靠谱方案:
方案一:改用主键关联字段(最直接)
如果你更习惯用ID来传递关联关系,直接在序列化器里覆盖默认的超链接字段,换成PrimaryKeyRelatedField就行,完全不影响外键关联逻辑:
from rest_framework import serializers from .models import Postinfo, Userinfo class req_AddPostSerializer(serializers.HyperlinkedModelSerializer): # 覆盖默认的超链接外键字段,改用主键匹配 useruid = serializers.PrimaryKeyRelatedField(queryset=Userinfo.objects.all()) class Meta: model = Postinfo fields = ('useruid', 'content', 'url') # url是HyperlinkedModelSerializer自动生成的,可选保留
这样你传{"useruid": 1, "content": "test"}(甚至字符串"1"DRF也会自动转换)就能正常创建关联的Postinfo对象了。
方案二:自定义超链接字段适配你的useruid字段
如果坚持想用超链接形式,但希望通过useruid的值来匹配关联对象,可以自定义HyperlinkedRelatedField,指定查找字段和对应视图的名称:
class req_AddPostSerializer(serializers.HyperlinkedModelSerializer): useruid = serializers.HyperlinkedRelatedField( queryset=Userinfo.objects.all(), view_name='userinfo-detail', # 这里要填Userinfo详情视图的URL名称(urls.py里name参数的值) lookup_field='useruid' # 指定用Userinfo的useruid字段作为查找依据 ) class Meta: model = Postinfo fields = ('useruid', 'content', 'url')
这种情况下,请求数据需要传Userinfo的详情URL(比如"/api/userinfo/1/"),但只要你的路由配置正确,就能通过useruid的值匹配到对应的用户对象。
为啥会报错?
简单说:HyperlinkedModelSerializer默认把外键字段处理成HyperlinkedRelatedField,这个字段只接受关联对象的URL字符串,而不是ID。你传"1"这种ID字符串,它找不到对应的URL匹配,自然就抛出"invalid hyperlink - no url match"或者类型错误了。
内容的提问来源于stack exchange,提问作者Adam
相关产品推荐
相关产品推荐

