Graphene Django - 一对多关系外键的突变

2024-02-08

我想知道如何正确创建突变来创建这个 django 模型:

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)

如您所见,有三个外键。对于型号Currency, Country and 家长(本人). 公司 DjangoObjectType看起来很简单,如下所示:

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

最后是我的突变类创建公司 have Currency, Country and 自己(家长)定义为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 服务器时,会引发断言错误。

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

很长一段时间以来,我一直在寻找一些关于一对多外键的好教程,所以如果有人知道如何清晰地实现这个解决方案,我将非常高兴。

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


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

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 要查询(请求)的用户类型。

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

作为 Arguments 类,有 CompanyInput ,它具有嵌套输入,例如货币或国家或自我(就像对象中的对象)。

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Graphene Django - 一对多关系外键的突变 的相关文章

随机推荐