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
相关产品推荐
相关产品推荐

