处理GraphQL(石墨烯)中的外键

问题描述 投票:1回答:1

我正在使用Django-Graphene构建和为我的Web应用提供API。我建立了一个简单的结构,其中有Product属于category

from graphene_django import DjangoObjectType
import graphene
from .models import ProductModel, CategoryModel


class CategoryType(DjangoObjectType):
    class Meta:
        model = CategoryModel


class ProductType(DjangoObjectType):
    category = graphene.Field(CategoryType)

    class Meta:
        model = ProductModel


class CategoryInput(graphene.InputObjectType):
    title = graphene.String()


class ProductInput(graphene.InputObjectType):
    title = graphene.String()
    category = graphene.Field(CategoryInput)


class Query(graphene.ObjectType):
    products = graphene.List(ProductType)
    categories = graphene.List(CategoryType)

    def resolve_products(self, info):
        return ProductModel.objects.all()

    def resolve_categories(self, info):
        return CategoryModel.objects.all()


class CreateProduct(graphene.Mutation):
    class Arguments:
        product_data = ProductInput(required=True)

    product = graphene.Field(ProductType)

    @staticmethod
    def mutate(self, info, product_data):
        product = ProductModel.objects.create(**product_data)
        product.save()
        return CreateProduct(product=product)


class CreateCategory(graphene.Mutation):
    class Arguments:
        title = graphene.String()

    category = graphene.Field(CategoryType)

    def mutate(self, info, title):
        category = CategoryModel(title=title)
        category.save()
        return CreateCategory(category=category)


class Mutations(graphene.ObjectType):
    create_product = CreateProduct.Field()
    create_category = CreateCategory.Field()


schema = graphene.Schema(query=Query, mutation=Mutations)

但是当我尝试变异时,我需要传递CategoryModel的一个实例,我无法弄清楚该怎么做:

mutation X {
  createProduct(productData: {title: "title", category: {}}) {
    product {
      id
    }
  }
}

如何创建需要标题和类别的产品?

python django graphql graphene-python
1个回答
-1
投票

昨天我曾经有过类似的问题,但是似乎我对GRAPHENE的了解还没有更好。但是我写了一些有趣的代码,它们起作用了,可能会有更多的石墨烯解决方法。

class ProductInput(graphene.InputObjectType):
    name = graphene.String()

class ProductPayload(graphene.Mutation):
    product = graphene.Field(ProductType)

    class Meta:
        input = ProductInput(required=True)
        category_name = graphene.String(required=True)

    def mutate(self, info, input=None, category_name=None):
        cat = None
        if category_name is not None:
            cat = Category.objects.get(name=category_name)
        product = Product.objects.create(name=input.name, category=cat)

        return ProductPayload(product=product)

class ProductMutation(graphene.ObjectType):
    create_product = ProductPayload.Field()

schema = graphene.Schema(mutation=ProductMutation

要在您的石墨烯中进行突变,

mutation {
    createProduct(input: {name: "Your product name"}, category_name: "your category name") {
        product {
            name,
            category {
                name

            }

        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.