Django中如何将请求用户分配给模型外键字段(服务器所有者)
问题解决方法
你遇到的问题是因为序列化器在验证阶段就要求owner字段必须存在,而你的请求里没传这个字段,虽然在perform_create里会补全该字段,但验证不通过的话根本走不到这一步。解决方法很简单,修改序列化器,把owner设为只读字段即可:
修改序列化器
class ServerSerializer(serializers.ModelSerializer): class Meta: model = Server fields = '__all__' # 添加这行,让序列化器不要求前端传owner,同时返回数据时会包含该字段 read_only_fields = ['owner']
或者你也可以明确指定需要的字段,避免包含不必要的字段,同时标记自动生成/设置的字段为只读:
class ServerSerializer(serializers.ModelSerializer): class Meta: model = Server # 只包含用户需要填写和自动生成的字段 fields = ['name', 'description', 'icon', 'creation_date', 'owner'] # 标记自动设置/生成的字段为只读 read_only_fields = ['owner', 'creation_date']
原理说明
DRF的序列化器会在执行perform_create之前完成数据验证,原本的序列化器因为fields='__all__'包含了owner字段,而模型里owner是必填的ForeignKey,所以序列化器会强制要求请求里提供这个字段。把它设为read_only_fields后,序列化器在验证时会忽略这个字段,同时在返回响应时依然会把owner的数据包含进去,完全符合你的需求:用户只需要填写名称、图标、描述,服务器自动将当前请求用户设为所有者。
内容的提问来源于stack exchange,提问作者Tom Xavier
相关产品推荐
相关产品推荐

