我想知道如何正确创建变异来创建这个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
最后,我的变异类CreateCompany具有像graphene.Field()
定义的Currency,Country和Self(Parent):
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类时,公司是变异成功时返回的对象(是CompanyType对象),因为我们创建公司并且我们想要对象公司的响应。
作为Arguments类,有CompanyInput,它具有嵌套输入,如货币或国家或自我(它在对象中的对象)。
静态方法mutate将调用Django create function,这个创建的对象将被分配给我们的公司对象,即CompnyType,这将是该响应。
(当你想在创建之前和之后实现一些业务逻辑时,你可以调用另一个函数,但是变异方法必须返回特定对象或者被定义为响应的对象。对于我在CreateCompany类中的公司。当然可以是更多的对象或对象列表。它只取决于你。)