【问题标题】:Handling ForeignKey in GraphQL (graphene)在 GraphQL 中处理外键(石墨烯)
【发布时间】:2020-09-19 06:24:20
【问题描述】:

我正在使用 Django-Graphene 为我的 web 应用程序构建和 API。我已经建立了这个简单的结构,其中我有属于categoryProduct

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
    }
  }
}

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

【问题讨论】:

  • Arguments 类中,category 不必是字段,而是任何其他标量类型。例如 String, ID, ... 那么你就不需要传递整个 Object

标签: python django graphql graphene-python


【解决方案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

要在您的 graphiql 中进行更改,

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

            }

        }
    }
}

【讨论】:

    猜你喜欢
    • 2017-05-11
    • 2017-05-13
    • 2020-07-27
    • 2018-03-11
    • 2023-03-08
    • 2020-05-13
    • 1970-01-01
    • 2018-03-22
    • 2019-08-26
    相关资源
    最近更新 更多