You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django REST Framework中如何通过request.user自动填充模型user字段

问题解决方法

核心错误分析

  1. 序列化器误用:视图里错误使用UserSerializer处理请求,导致尝试创建已存在的当前登录用户,这是报错的直接原因,同时完全跳过了Product的创建逻辑,所以Product实例未保存。
  2. 视图配置格式错误:serializer_class和permission_classes被写成字符串列表,DRF无法识别,必须直接引用类。
  3. 序列化器配置冲突:同时使用fields = "__all__"和exclude = ["user"]无效,DRF会忽略其中一项,需二选一。
  4. perform_create逻辑错误:未正确使用传入的序列化器保存实例,反而错误实例化新的序列化器。

修正后的代码

序列化器修正

class ProductSerializer(serializers.ModelSerializer):
    class Meta:
        model = Product
        exclude = ["user"]  # 也可以明确指定字段:fields = ["title", "description"]

视图修正

from rest_framework import generics, permissions, status
from rest_framework.response import Response
from .models import Product
from .serializers import ProductSerializer

class CreateProduct(generics.GenericAPIView):
    serializer_class = ProductSerializer
    permission_classes = [permissions.IsAuthenticated]

    def perform_create(self, serializer):
        # 自动填充当前登录用户到Product的user字段
        serializer.save(user=self.request.user)

    def post(self, request, *args, **kwargs):
        # 使用ProductSerializer处理请求数据
        serializer = self.get_serializer(data=request.data)
        # 验证不通过时直接抛出异常返回400
        serializer.is_valid(raise_exception=True)
        # 执行保存逻辑
        self.perform_create(serializer)
        # 返回创建成功的响应
        return Response(serializer.data, status=status.HTTP_201_CREATED)

修正说明

  • 序列化器:移除冲突的fields配置,确保只暴露需要用户输入的字段(title、description),user字段由视图自动填充。
  • 视图配置:将serializer_class和permission_classes改为直接引用类,DRF才能正确加载序列化器和权限校验规则。
  • Post方法逻辑:改用ProductSerializer处理请求,调用get_serializer获取实例,验证通过后调用perform_create完成用户关联和保存,最后返回成功响应。
  • perform_create:通过serializer.save(user=self.request.user)将当前登录用户绑定到新创建的Product实例上,实现user字段自动填充。

内容的提问来源于stack exchange,提问作者Mehdi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 21:14:54