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

Django序列化含ForeignKey、OneToOneField的模型时报JSON不可序列化错误

错误原因
  • 核心原因是你直接将Serializer实例对象作为返回值返回,DRF的JSON渲染器只能序列化序列化器处理后的数据,无法序列化序列化器实例本身。
  • 额外的错误点:你在实例化序列化器时传入的read_only=True是无效参数,该参数是字段级配置项,不能作用于序列化器实例。
修复方法

修改你的返回代码即可:

subscription_information = SubscriptionInformation.objects.get(user_id=user.id) 
# 移除无效的read_only参数,实例化序列化器
serializer = SubscriptionInformationDetailSerializer(subscription_information)
# 返回序列化后的数据对象,而非序列化器实例
return serializer.data
补充说明(可选)

如果你需要返回关联的User、Subscription对象的详细信息而非仅主键,可以使用嵌套序列化,修改序列化器如下:

# 定义User简易序列化器
class UserSimpleSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ("id", "username", "email") # 按需配置需要返回的字段

# 定义Subscription简易序列化器
class SubscriptionSimpleSerializer(serializers.ModelSerializer):
    class Meta:
        model = Subscription
        fields = ("id", "name", "price") # 按需配置需要返回的字段

class SubscriptionInformationDetailSerializer(serializers.ModelSerializer):
    # 嵌套序列化关联对象,此处传入read_only=True是正确的字段级配置
    user = UserSimpleSerializer(read_only=True)
    subscription = SubscriptionSimpleSerializer(read_only=True)

    class Meta:
        model = SubscriptionInformation
        fields = (
            "id",
            "user",
            "subscription",
            "subscription_type",
            "next_payment_amount",
            "next_payment_date",
            "payment_made",
            "subscription_date",
        )

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 04:27:00