Django DRF JSON API使用ResourceRelatedField生成反向关系related链接报错问题
问题解答
1. ResourceRelatedField是否是实现反向关系"related"链接的正确方案?
是,ResourceRelatedField是DRF JSON API官方提供的专门处理JSON:API规范关系字段的组件,同时支持正向、反向关系的related链接生成,是符合你需求的正确实现方案。
2. related_link_view_name和related_link_url_kwarg参数的正确搭配方式
related_link_view_name直接填写你在urls.py中定义的对应反向关系视图的name属性,你当前配置的topobject-relatedobject-list是正确的。related_link_url_kwarg填写你URL pattern中定义的父级资源参数名,你的URL规则是topobjects/<int:pk>/relatedobjects/,参数名为pk,所以你当前配置的related_link_url_kwarg='pk'也是正确的,默认会用当前序列化的TopObject实例的主键值填充这个URL参数。
你当前报错的修复方案
你访问relatedobjects接口报错的核心原因是循环序列化和反向关系字段配置错误,按以下步骤修改即可:
先确认模型反向关系配置
确保RelatedObject模型的topobject外键字段设置了related_name='relatedobjects',示例:# models.py 中RelatedObject定义补充 class RelatedObject(models.Model): topobject = models.ForeignKey(TopObject, on_delete=models.CASCADE, related_name='relatedobjects') # 其他字段省略如果不设置
related_name,默认反向关系字段名为relatedobject_set,你需要对应修改序列化器中的字段名。修改TopObjectSerializer的relatedobjects字段配置
反向关系默认是只读的,不需要指定queryset,加上read_only=True即可避免反序列化和关联序列化时的报错:relatedobjects = ResourceRelatedField( many=True, read_only=True, related_link_view_name='topobject-relatedobject-list', related_link_url_kwarg='pk' )解决循环序列化问题
你当前的RelatedObjectSerializer用了fields = '__all__',会自动序列化topobject外键字段,而topobject的序列化器又包含relatedobjects字段,导致递归序列化报错。在RelatedObjectSerializer中显式定义topobject为普通关系字段即可:class RelatedObjectSerializer(serializers.HyperlinkedModelSerializer): topobject = ResourceRelatedField( queryset=TopObject.objects, related_link_view_name='topobject-detail' ) class Meta: model = RelatedObject fields = '__all__'
修改后重新启动服务,TopObject的返回结果就会自动生成你想要的related链接。
内容的提问来源于stack exchange,提问作者Sven S
相关产品推荐
相关产品推荐

