【问题标题】:Is there a way of chaining multiple models and query them in a single response?有没有办法链接多个模型并在单个响应中查询它们?
【发布时间】:2020-07-07 01:57:36
【问题描述】:

您好,我是 Django 新手,需要一点帮助。我正在为新闻网站使用 Django 和 Graphene 构建 API。我为每个新闻演员创建了多个帖子模型,以便每个新闻演员都可以在 Django 管理面板中查看其对应的模型。我面临的问题是我需要为单个查询链接或组合所有模型,以便我可以显示从所有模型创建的所有帖子。

在这个例子中,我在模式文件中导入了两个后期模型。如果是的话,这是正确的方法吗?有没有办法将它们链接到一个查询中?

import graphene
from graphene_django import DjangoObjectType
from .models import News, Sport

class NewsType(DjangoObjectType):
    class Meta:
        model = News

class SportType(DjangoObjectType):
    class Meta:
        model = Sport

class Query(graphene.ObjectType):
    news = graphene.List(NewsType)
    sports = graphene.List(SportType)

    def resolve_news(self, info):
        return News.objects.all()

    def resolve_sports(self, info):
        return Sports.objects.all()

谢谢!

【问题讨论】:

    标签: python django graphql graphene-python


    【解决方案1】:

    如果两个模型具有相同的字段并且石墨烯允许在解析器中使用列表而不是查询集,那么您可以简单地使用chain

    from itertools import chain
    chained_results = list(chain(News.objects.all(), Sports.objects.all()))
    

    【讨论】:

    • 是的,两个模型都有相同的字段,但我不明白如何检查我的解析器是否允许使用列表而不是查询集。如果您有时间,我将非常感谢您的帮助。
    【解决方案2】:

    这就是我现在的位置。 Post 和 Post2 模型具有相同的字段。

    schema.py

    import graphene
    from graphene_django import DjangoObjectType
    from .models import Post, Post2
    from itertools import chain
    from graphene import relay
    
    class PostType(DjangoObjectType):
        class Meta:
            model = Post
    
    class Post2Type(DjangoObjectType):
        class Meta:
            model = Post2
    
    class AssetUnion(graphene.types.Union):
        class Meta:
            types = [Post, Post2]
    
    class ParentNode(graphene.ObjectType):
        assets = graphene.Field(AssetUnion)
        def resolve_assets(self, info):
            return list(chain(Post.objects.all(), Post2.objects.all()))
    
    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"
          }
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2022-10-08
      • 2012-05-30
      • 2012-10-14
      • 2016-10-24
      • 1970-01-01
      • 2020-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多