在Django中使用GraphQL:通过related_name实现反向外键关联
解决Graphene-Django反向关联字段的Iterable错误
错误原因
你遇到的Expected Iterable, but did not find one for field 'CategoryType.grocery'错误,本质是因为反向外键关联返回的是多个Grocery对象的集合(QuerySet),但你在CategoryType里把grocery字段定义成了单个对象类型,Graphene无法将集合匹配到单个对象类型,因此抛出该错误。
解决方案
1. 确保模型的反向关联名称正确
首先确认你的Grocery模型中,外键字段的related_name已正确设置(建议用复数形式更符合语义,比如groceries):
# models.py from django.db import models class Category(models.Model): name = models.CharField(max_length=100) class Grocery(models.Model): name = models.CharField(max_length=100) category = models.ForeignKey( Category, on_delete=models.CASCADE, related_name='groceries' # 反向关联的名称,需与后续Type定义对应 )
2. 在CategoryType中正确定义反向关联字段
你需要将反向关联字段定义为列表类型,告诉Graphene这是一个可迭代的集合。有两种实现方式:
方式一:手动定义字段并指定解析逻辑
# schema.py import graphene from graphene_django import DjangoObjectType from .models import Category, Grocery class GroceryType(DjangoObjectType): class Meta: model = Grocery fields = "__all__" class CategoryType(DjangoObjectType): class Meta: model = Category fields = "__all__" # 用graphene.List包裹GroceryType,表示这是多个对象的集合 groceries = graphene.List(GroceryType) def resolve_groceries(self, info): # 自定义解析逻辑(可选),默认Graphene会自动通过related_name获取数据 return self.groceries.all()
方式二:让Graphene自动识别反向关联
如果不需要自定义解析逻辑,只需在CategoryType的Meta中包含反向关联的名称,Graphene会自动识别为列表类型:
class CategoryType(DjangoObjectType): class Meta: model = Category # 显式包含反向关联字段,或直接用fields = "__all__" fields = ('id', 'name', 'groceries')
3. 测试查询
现在你可以执行如下GraphQL查询,获取每个Category对应的Grocery列表:
query GetCategoriesWithGroceries { categories { id name groceries { id name } } }
内容的提问来源于stack exchange,提问作者Sachin Rajput
相关产品推荐
相关产品推荐

