有没有一种方法可以链接多个模型并在一个响应中查询它们?

2024-09-24 00:34:24 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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()

谢谢大家!


Tags: djangofrom模型importmodel链接帖子meta
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"
      }
  }
}

如果两个模型具有相同的字段,并且graphene允许在解析器中使用list而不是queryset,那么您可以简单地使用chain

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

相关问题 更多 >