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

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']

原因分析

  1. 序列化器传入数据错误:你将包含carts和sum_price的字典传给了序列化器,但AddToCartSerializer的作用是序列化AddToCart实例,应该直接传入carts这个QuerySet,而非外层的context字典。
  2. 序列化器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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 10:10:30