如何在Django REST Framework中POST实体时指定整数型外键值
你可以通过给序列化器新增可写的用户ID关联字段实现需求,不需要修改视图和模型,仅需调整MessageSerializer代码即可:
方案1(兼容原有GET返回结构)
class UserSerializer(serializers.ModelSerializer): class Meta: model = User fields = ['username'] class MessageSerializer(serializers.ModelSerializer): # 保留原有的只读嵌套用户字段,满足GET请求返回用户名的需求 user = UserSerializer(read_only=True) # 新增仅用于写入的用户ID字段,关联到模型的user属性 user_id = serializers.PrimaryKeyRelatedField( queryset=User.objects.all(), source='user', write_only=True ) class Meta: model = Message fields = '__all__'
改完后API的POST表单会自动新增user_id输入项,传入整数类型的用户ID即可完成关联,GET请求返回的结构和原有逻辑完全一致,不需要调整原有查询接口的适配逻辑。
方案2(读写字段名统一为user)
如果希望POST时传入的字段名也叫user而不是user_id,可以用序列化器的序列化阶段重写实现:
class UserSerializer(serializers.ModelSerializer): class Meta: model = User fields = ['username'] class MessageSerializer(serializers.ModelSerializer): # 写操作接收用户ID user = serializers.PrimaryKeyRelatedField(queryset=User.objects.all()) # 读操作重写返回嵌套用户信息 def to_representation(self, instance): data = super().to_representation(instance) data['user'] = UserSerializer(instance.user).data return data class Meta: model = Message fields = '__all__'
这种写法下读写的字段名都为user,读返回嵌套用户对象,写接收用户ID,更符合RESTful接口设计规范。
内容的提问来源于stack exchange,提问作者Oros Tom
相关产品推荐
相关产品推荐

