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

Django REST Framework多对多字段序列化无数据问题求助

问题修复方案

1. 修正ManyToManyField的默认值错误

你的Advertisements模型中product字段的default=2不符合ManyToManyField的规则——该字段的默认值必须是可迭代对象(如列表)或返回可迭代对象的可调用函数,直接设置单个ID会导致默认关联失效,最终序列化返回空数组。

修改模型字段:

# 方式1:设置默认关联ID为2的Product(用列表包裹)
product = models.ManyToManyField(Product, blank=True, default=lambda: [2], related_name='+')

# 方式2:若不需要默认关联,直接移除default参数(已设置blank=True允许空)
product = models.ManyToManyField(Product, blank=True, null=True, related_name='+')

2. 确保数据库存在有效关联

如果之前ForeignKey的数据未迁移到ManyToMany关联表,需手动为目标广告实例绑定产品:

# 在Django Shell中执行
ad = Advertisements.objects.get(id=1)
target_product = Product.objects.get(id=1)
ad.product.add(target_product)
ad.save()

3. 调整序列化器匹配期望输出

你的期望响应中产品字段名为product_name,但当前ProductSerializer返回的是name,可通过字段映射修正:

class ProductSerializer(serializers.ModelSerializer):
    product_name = serializers.CharField(source='name')  # 将模型的name字段映射为product_name
    packages = PackageSerializer(many=True)
    coverage_amount_range = serializers.ReadOnlyField()

    class Meta:
        model = Product
        fields = ['id', 'product_name']

4. 查询时预加载关联数据

ManyToMany关系需要用prefetch_related预加载关联数据,否则序列化器无法获取关联的Product实例:

# 视图层查询示例
ads = Advertisements.objects.all().prefetch_related('product')
serializer = AdvertisementSerializer(ads, many=True)
return Response(serializer.data)

最终验证

完成上述修改后,重新运行项目即可得到预期的JSON响应:

[
    {
        "id": 1,
        "title": "Test Ad",
        "product": [
           {"id" : 1,
           "product_name" : "test"}
        ]
    }
]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 05:33:13