Graphene Django - 具有一对多关系外键的变异 [英] Graphene Django - Mutation with one to many relation foreign key

查看:21
本文介绍了Graphene Django - 具有一对多关系外键的变异的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想知道如何正确创建用于创建此 django 模型的突变:

I would like to know how to properly create mutation for creating this django model:

class Company(models.Model):

    class Meta:
        db_table = 'companies'
        app_label = 'core'
        default_permissions = ()

    name = models.CharField(unique=True, max_length=50, null=False)
    email = models.EmailField(unique=True, null=False)
    phone_number = models.CharField(max_length=13, null=True)
    address = models.TextField(max_length=100, null=False)
    crn = models.CharField(max_length=20, null=False)
    tax = models.CharField(max_length=20, null=False)
    parent = models.ForeignKey('self', null=True, on_delete=models.CASCADE)
    currency = models.ForeignKey(Currency, null=False, on_delete=models.CASCADE)
    country = models.ForeignKey(Country, null=False, on_delete=models.CASCADE)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

如您所见,共有三个外键.对于模型货币国家Parent(self).Company DjangoObjectType 看起来非常简单,如下所示:

As you see, there are three Foreign keys. For model Currency, Country and Parent(self). Company DjangoObjectType looks very simple like this:

class CompanyType(DjangoObjectType):
    class Meta:
        model = Company

最后我的变异类 CreateCompanyCurrencyCountrySelf(Parent)graphene.Field():

And finally my mutation class CreateCompany have Currency, Country and Self(Parent) defined like graphene.Field():

class CompanyInput(graphene.InputObjectType):
    name = graphene.String(required=True)
    email = graphene.String(required=True)
    address = graphene.String(required=True)
    crn = graphene.String(required=True)
    tax = graphene.String(required=True)
    currency = graphene.Field(CurrencyType)
    country = graphene.Field(CountryType)
    parent = graphene.Field(CompanyType)
    phone_number = graphene.String()


class CreateCompany(graphene.Mutation):
    company = graphene.Field(CompanyType)

    class Arguments:
        company_data = CompanyInput(required=True)

    @staticmethod
    def mutate(root, info, company_data):
        company = Company.objects.create(**company_data)
        return CreateCompany(company=company)

当我想启动 django 服务器时,会引发断言错误.

When i want to start django server, Assertion error will be raised.

AssertionError: CompanyInput.currency field type must be Input Type but got: CurrencyType.

我很长时间以来一直在为一对多外键寻找一些很好的教程,所以如果有人知道如何很好地实现这个解决方案,我会很高兴.

I was finding some good tutorial for one to many foreign key for a long time, so if someone know how to implement this solution nice and clear I would be very glad.

PS:请您也向我展示 GraphQL 查询的示例,以便我知道如何调用该突变?非常感谢.

PS: Please can you also show me example of GraphQL query, so I would know how to call that mutation? Thank you very much.

推荐答案

对于那些仍在寻找答案的人.

class CompanyInput(graphene.InputObjectType):
    name = graphene.String(required=True)
    email = graphene.String(required=True)
    address = graphene.String(required=True)
    crn = graphene.String(required=True)
    tax = graphene.String(required=True)
    currency = graphene.Field(CurrencyInput)
    country = graphene.Field(CountryInput)
    parent = graphene.Field(CompanyInput)
    phone_number = graphene.String()

class CurrencyInput(graphene.InputObjectType):
    name = graphene.String()
    code = graphene.String()
    character = graphene.String()

class CountryInput(graphene.InputObjectType):
    name = graphene.String()
    code = graphene.String()


class CreateCompany(graphene.Mutation):
    company = graphene.Field(CompanyType)

    class Arguments:
        company_data = CompanyInput(required=True)

    @staticmethod
    def mutate(root, info, company_data):
        company = Company.objects.create(**company_data)
        return CreateCompany(company=company)

如您所见,我刚刚替换了输入对象的 CompanyType、CurrencyType 和 CountryType 对象,因为 Input 对象指定了要查询(请求)的用户类型的 INPUT.

As you can see, I just replaced CompanyType, CurrencyType and CountryType objects for input objects because Input objects specifying INPUT which user type to query (request).

指定返回对象的类型对象,当一切都成功时,变异返回.因此,当您仅查看类 CreateCompany 时, company 是在变异成功时将返回的对象(Is CompanyType 对象),因为我们创建了公司并且我们想要对象公司的响应.

Type objects specifying return object which mutation returns, when everything was successfully. So when you just look at class CreateCompany, company is object which will be returned when mutation is success (Is CompanyType object) because we creating company and we wants response of object company.

作为 Arguments 类,CompanyInput 具有嵌套的输入,如货币或国家或自我(它类似于对象中的对象).

As Arguments class there is CompanyInput which has nested inputs like currency or country or self (its like object in object).

静态方法 mutate 将调用 Django create 函数,这个创建的对象将被分配给我们公司的对象,即 CompnyType,这将是该响应.

Static method mutate will call Django create function and this created object will be assigned to our company object which is CompnyType and this will be that response.

(当然,当您想在创建之前和之后实现一些业务逻辑时,您可以调用另一个函数而不是创建,但变异方法必须返回特定的对象或已定义为响应的对象.对于我公司在 CreateCompany 类中.的当然可以有更多的对象或对象列表.这取决于你.)

(Of course you can call another function than create when you want to implement some business logic before and after creating but mutation method must return specific object or objects which was or were defined as response. For me company in CreateCompany class. Of course there can be more objects or lists of objects. It only depends on you.)

这篇关于Graphene Django - 具有一对多关系外键的变异的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆