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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 22:50:22