GraphQL 在 Django 中的一个请求中进行多个查询

Posted

技术标签:

【中文标题】GraphQL 在 Django 中的一个请求中进行多个查询【英文标题】:GraphQL multiple queries in one request in Django 【发布时间】:2020-07-08 11:48:56 【问题描述】:

我使用 Django 和石墨烯来构建 API,但我想在一个查询中组合两个模型,模型的所有字段都是相同的。

示例 架构.py

import graphene
from graphene_django import DjangoObjectType
from .models import Post, Post2

class PostType(DjangoObjectType):
    class Meta:
        model = Post

class Post2Type(DjangoObjectType):
    class Meta:
        model = Post2

class Query(graphene.ObjectType):
    post = graphene.List(PostType)
    post2 = graphene.List(Post2Type)

    def resolve_post(self, info):
        return Post.objects.all()

    def resolve_post2(self, info):
        return Post2.objects.all()

我收到此回复:


  "data": 
    "post": [
      
        "title": "post 1"
      
    ],
    "post2": [
      
        "title": "post test"
      
    ]
  

我想得到的是:


  "data": 
    "allPost": [
      
        "title": "post 1"
      ,
      
        "title": "post test"
      
  

【问题讨论】:

【参考方案1】:

您可以创建一个联合类型 (https://docs.graphene-python.org/en/latest/types/unions/#unions) 的列表,它应该可以满足您的需求:

class PostUnion(graphene.Union):
    class Meta:
        types = (PostType, Post2Type)

    @classmethod
    def resolve_type(cls, instance, info):
        # This function tells Graphene what Graphene type the instance is
        if isinstance(instance, Post):
            return PostType
        if isinstance(instance, Post2):
            return Post2Type
        return PostUnion.resolve_type(instance, info)


class Query(graphene.ObjectType):
    all_posts = graphene.List(PostUnion)

    def resolve_all_posts(self, info):
        return list(Post.objects.all()) + list(Post2.objects.all())

【讨论】:

以上是关于GraphQL 在 Django 中的一个请求中进行多个查询的主要内容,如果未能解决你的问题,请参考以下文章

Django 中的 GraphQL 查询返回 None

带有 JWT 身份验证实现的 Django GraphQL API 仍然允许来自 Postman 的未经身份验证的请求获取数据。我该如何解决?

无法使用 graphene_django 从 GraphQL 获取最后 n 个元素

从 GraphQL 计算一个值并将其保存在 Django 模型中

如何在 django 中进行管理操作以下载用户的 pdf 文件

界面中包含的 Graphql 类型未添加到 graphene-django 中的模式