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

DRF POST请求报错:调用Item.objects.create()触发TypeError

问题解决步骤

1. 修复序列化器字段匹配错误

你的Item模型中外键字段为category_id,但序列化器里定义了category = CategorySerializer(),DRF默认会将category参数传递给Item.objects.create(),但模型不存在category字段,这是触发TypeError的核心原因。

调整序列化器字段:

如果是关联已存在的分类,修改为以下结构(保留嵌套序列化的同时,添加可写入的外键字段):

class ItemSerializer(serializers.ModelSerializer):
    category = CategorySerializer(read_only=True)
    category_id = serializers.PrimaryKeyRelatedField(queryset=Category.objects.all())
    photos = PhotoSerializer(many=True, required=False)
    style_photos = StylePhotoSerializer(many=True, required=False)

    class Meta:
        model = Item
        fields = [
            'description',
            'feature',
            'product_defect',
            'size',
            'wear_count',
            'price',
            'category_id',
            'category',
            'photos',
            'style_photos',
        ]

2. 重写序列化器create方法处理嵌套对象

photos和style_photos是关联的子模型实例,DRF默认创建逻辑不会自动生成这些对象,需要手动处理:

class ItemSerializer(serializers.ModelSerializer):
    category = CategorySerializer(read_only=True)
    category_id = serializers.PrimaryKeyRelatedField(queryset=Category.objects.all())
    photos = PhotoSerializer(many=True, required=False)
    style_photos = StylePhotoSerializer(many=True, required=False)

    class Meta:
        model = Item
        fields = [
            'description',
            'feature',
            'product_defect',
            'size',
            'wear_count',
            'price',
            'category_id',
            'category',
            'photos',
            'style_photos',
        ]

    def create(self, validated_data):
        # 提取嵌套的照片数据
        photos_data = validated_data.pop('photos', [])
        style_photos_data = validated_data.pop('style_photos', [])
        # 绑定当前请求用户为商品所属用户
        validated_data['user_id'] = self.context['request'].user
        # 创建Item主实例
        item = Item.objects.create(**validated_data)
        # 创建关联的商品图片
        for photo_data in photos_data:
            Photo.objects.create(item_id=item, **photo_data)
        # 创建关联的穿搭图片
        for style_photo_data in style_photos_data:
            StylePhoto.objects.create(item_id=item, user_id=self.context['request'].user, **style_photo_data)
        return item

3. 修正视图查询集错误

你的视图类错误地使用User.objects.all()作为查询集,需替换为Item模型的查询集:

from rest_framework import generics
from .serializers import ItemSerializer
from .models import Item


class ItemListAPIView(generics.ListCreateAPIView):
    queryset = Item.objects.all()
    serializer_class = ItemSerializer

    # 可选:仅显示当前用户的商品
    def get_queryset(self):
        return Item.objects.filter(user_id=self.request.user)


class ItemDetailAPIView(generics.RetrieveUpdateDestroyAPIView):
    queryset = Item.objects.all()
    serializer_class = ItemSerializer

4. 规范POST请求数据格式

发送请求时,需按照以下格式传递数据(示例):

{
    "description": "测试商品",
    "feature": "纯棉材质",
    "product_defect": "无瑕疵",
    "size": "M",
    "wear_count": 2,
    "price": 10000,
    "category_id": 1,
    "photos": [{"photo": "图片文件或URL"}],
    "style_photos": [{"photo": "穿搭图片文件或URL"}]
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 22:48:52