Есть ли способ связать несколько моделей и запросить их в одном ответе? - PullRequest
0 голосов
/ 26 марта 2020

Привет, я новичок в Django и мне нужна небольшая помощь. Я создаю API, используя Django и графен для новостного сайта. Я создал несколько моделей постов для каждого выпуска новостей, чтобы каждый выпуск новостей мог просто просматривать свою соответствующую модель на панели администрирования 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()

Спасибо!

Ответы [ 2 ]

1 голос
/ 26 марта 2020

Если обе модели имеют одинаковые поля И графен позволяет использовать список вместо набора запросов в резольверах, тогда вы можете просто использовать chain :

from itertools import chain
chained_results = list(chain(News.objects.all(), Sports.objects.all()))
0 голосов
/ 27 марта 2020

Это то, где я сейчас нахожусь. И модели 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"
      }
  }
}
...