gpt4 book ai didi

django - Graphene Django - 具有一对多关系外键的变异

转载 作者:行者123 更新时间:2023-12-03 14:20:31 43 4
gpt4 key购买 nike

我想知道如何正确创建用于创建此 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)

如您所见,共有三个外键。型号 货币 , 国家 家长(自己) . 公司 DjangoObjectType 看起来很简单,像这样:
class CompanyType(DjangoObjectType):
class Meta:
model = Company

最后是我的突变类 创建公司 货币 , 国家 自己( parent )定义为 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 对象指定了要查询(请求)的用户类型的 INPUT。

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

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

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

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

关于django - Graphene Django - 具有一对多关系外键的变异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53391097/

43 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com