Django序列化后数据为空求助:AddToCartSerializer返回空对象
问题:Django序列化后返回空对象的原因及解决方法
问题重现
视图代码
user = User.objects.filter(id=payload['id']).first() carts = AddToCart.objects.filter(user=user) sum_price = 0 for i in carts: sum_price += int(i.product.price) context = { 'carts': carts, 'sum_price': sum_price, } print(context) serializer = AddToCartSerializer(context, many=True) return Response(serializer.data)
终端打印的context:
{'carts': <QuerySet [<AddToCart: AddToCart object (3)>]>, 'sum_price': 100}
Postman输出:
[ {}, {} ]
模型定义
class AddToCart(models.Model): user = models.ForeignKey(User, on_delete=models.CASCADE) product = models.ForeignKey(Product, on_delete=models.CASCADE)
序列化器定义
class AddToCartSerializer(serializers.ModelSerializer): user = serializers.ReadOnlyField(source='User') product = serializers.ReadOnlyField(source='Product') class Meta: model = AddToCart fields = ['user', 'product']
原因分析
- 序列化器传入数据错误:你将包含
carts和sum_price的字典传给了序列化器,但AddToCartSerializer的作用是序列化AddToCart实例,应该直接传入carts这个QuerySet,而非外层的context字典。 - 序列化器source参数错误:模型中外键字段是小写的
user和product,但你写的source='User'和source='Product'是大写的类名,导致序列化器无法找到对应属性,最终返回空值。同时ReadOnlyField默认仅输出字符串,若source指向错误,无法获取有效数据。
解决步骤
1. 修正序列化器传入参数
将序列化器的传入对象从context改为carts:
# 错误写法 # serializer = AddToCartSerializer(context, many=True) # 修正后 serializer = AddToCartSerializer(carts, many=True)
2. 修正序列化器定义
根据需求选择以下方案:
方案一:输出外键ID或默认字符串
去掉自定义的user和product字段,让ModelSerializer自动处理外键:
class AddToCartSerializer(serializers.ModelSerializer): class Meta: model = AddToCart fields = ['user', 'product']
此时默认输出外键ID;若想输出对象的字符串表示(如用户名、产品名),改用StringRelatedField:
class AddToCartSerializer(serializers.ModelSerializer): user = serializers.StringRelatedField() product = serializers.StringRelatedField() class Meta: model = AddToCart fields = ['user', 'product']
方案二:输出用户/产品的详细信息
定义嵌套序列化器,输出关联对象的完整数据:
# 先定义用户和产品的序列化器 class UserSerializer(serializers.ModelSerializer): class Meta: model = User fields = ['id', 'username'] # 按需选择展示字段 class ProductSerializer(serializers.ModelSerializer): class Meta: model = Product fields = ['id', 'name', 'price'] # 按需选择展示字段 # 修改购物车序列化器 class AddToCartSerializer(serializers.ModelSerializer): user = UserSerializer(read_only=True) product = ProductSerializer(read_only=True) class Meta: model = AddToCart fields = ['user', 'product']
3. 包含sum_price返回给前端
若需将计算好的sum_price一并返回,需构建包含购物车数据和总价的响应字典:
serializer = AddToCartSerializer(carts, many=True) response_data = { 'carts': serializer.data, 'sum_price': sum_price } return Response(response_data)
内容的提问来源于stack exchange,提问作者temo pkhakadze
相关产品推荐
相关产品推荐

