微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 ManyToMany 字段在 graphene-django 中发布连接数据

如何解决使用 ManyToMany 字段在 graphene-django 中发布连接数据

我一直在寻找一个很好的示例,用于返回包含多对多字段中的联接数据的查询集,但我没有找到。

给定以下模型:

class Task(models.Model):
    id = models.UUIDField(primary_key=True,default=uuid.uuid4,editable=False)
    task_assignee = models.ForeignKey("User")
    is_draft = models.Boolean(default=True)
    detail = models.ManyToManyField("Detail",through="TaskDetails")


class Detail(models.Model):
    id = models.UUIDField(primary_key=True,editable=False)
    detail_name = models.CharField(max_length=250)

class TaskDetails(models.Model):
    id = models.UUIDField(primary_key=True,editable=False)
    task = models.ForeignKey("Task",related_name="detail_tasks")
    detail = models.ForeignKey("Detail",related_name="task_details")
    detail_value = models.CharField(max_length=250)

我想返回 Task 的数据及其相关详细信息。根据 this question 上的答案,我将架构调整为以下内容

class TaskDetailsType(DjangoObjectType):

    class Meta:
        model = TaskDetails
        fields = ("id","detail_name","detail_value")

        detail_name = graphene.String()

    def resolve_detail_name(value_obj,info):
        return value_obj.detail.detail_name


class TaskType(DjangoObjectType):

    class Meta:
        model = Task
        fields = ("id","task_details")

    task_details = graphene.List(TaskDetailsType)

    def resolve_task_details(value_obj,info):
        return value_obj.detail_tasks

我正在运行的查询

Task.objects.filter(task_assignee_id=info.context.user.id) \
    .filter(is_draft=False)

当我运行这个时,我得到一个错误

{'errors': [{'message': 'User Error: expected iterable,but not find one for field TaskType.taskDetails.'},{'message': 'User Error: expected iterable,but not not found找到一个字段 TaskType.taskDetails.'},{'message': '用户错误:预期可迭代,但没有找到字段 TaskType.taskDetails.'}],'data': {'getInBoxTasks': [{' id':'a430e49d-c9c3-4839-8f2c-aaebbfe9ef3a','taskDetails':无},{'id':'74c8dacc-1bfd-437a-ae34-7e111075ac5e',无},'taskDetails' :'10956caa-d74f-4a01-a5cf-9cac6a15c5a3','taskDetails':无}]}}

解决方法

正如@schillingt 所指出的和石墨烯所暗示的,问题在于 RelatedManager 不可迭代:

def resolve_task_details(value_obj,info):
    return value_obj.detail_tasks  # related manager

所以改变很简单:

def resolve_task_details(value_obj,info):
    return value_obj.detail_tasks.all()  # queryset -> iterable

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。