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

