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

如何在DRF中创建不含Product字段的Category序列化器?

问题解决:创建Category的API接口及"Category() got unexpected keyword arguments: 'user'"报错修复

核心问题分析

报错Category() got unexpected keyword arguments: 'user'的本质是:你在创建Category实例时传入了模型不存在的user参数,可能是视图中错误传递了request.user,或者前端请求携带了多余的user字段。同时你的序列化器设计过度复杂(嵌套了Product序列化),不符合"仅创建分类"的需求。


分步解决方案

1. 简化Category序列化器(仅用于创建分类)

先专注于分类创建的核心需求,去掉不必要的Product嵌套:

from rest_framework import serializers
from .models import Category

class CategoryCreateSerializer(serializers.ModelSerializer):
    class Meta:
        model = Category
        fields = ['name', 'slug']  # 仅保留模型存在的字段
        extra_kwargs = {
            'slug': {'required': False}  # 因为模型中slug是blank=True,设置为可选
        }

2. 修复APIView实现

确保视图不会传递多余的user参数到序列化器:

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from .models import Category
from .serializers import CategoryCreateSerializer

class CategoryCreateAPIView(APIView):
    def post(self, request):
        serializer = CategoryCreateSerializer(data=request.data)
        if serializer.is_valid():
            # 直接保存,不要传递user参数(除非模型有user字段)
            category = serializer.save()
            return Response({
                'id': category.id,
                'name': category.name,
                'slug': category.slug,
                'url': category.get_absolute_url()
            }, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

3. 彻底解决"user"参数报错

如果是前端请求携带了user字段,或者视图必须处理该字段,在序列化器中过滤掉:

class CategoryCreateSerializer(serializers.ModelSerializer):
    # 声明user为可选的写入字段(仅用于接收,不存入数据库)
    user = serializers.CharField(required=False, write_only=True)
    
    class Meta:
        model = Category
        fields = ['name', 'slug', 'user']

    def create(self, validated_data):
        # 从验证后的数据中移除user字段
        validated_data.pop('user', None)
        return super().create(validated_data)

可选:支持嵌套创建Product(如果需要)

如果需要同时创建分类和关联产品,修正你之前的序列化器错误:

from rest_framework import serializers
from .models import Category, Product

class ProductCreateSerializer(serializers.ModelSerializer):
    class Meta:
        model = Product
        fields = ['name', 'slug', 'description', 'price']

class CategoryWithProductsSerializer(serializers.ModelSerializer):
    products = ProductCreateSerializer(many=True, required=False)

    class Meta:
        model = Category
        fields = ['name', 'slug', 'products']

    def create(self, validated_data):
        # 取出产品数据,默认空列表
        products_data = validated_data.pop('products', [])
        category = Category.objects.create(**validated_data)
        
        # 批量创建关联产品
        for product_data in products_data:
            Product.objects.create(category=category, **product_data)
        
        return category

测试示例

仅创建分类的请求Body:

{
    "name": "数码产品",
    "slug": "electronics"
}

同时创建分类和产品的请求Body:

{
    "name": "图书",
    "slug": "books",
    "products": [
        {
            "name": "Django入门指南",
            "slug": "django-beginners",
            "price": 29.99
        }
    ]
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 05:30:05