グラフェンDjango-1対多の関係外部キーを使用したミューテーション

Source django django-models graphql graphene-python

この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)

ご覧のとおり、3つの外部キーがあります。モデルの場合通貨および親(自己) Company DjangoObjectTypeは次のように非常に単純に見えます。
class CompanyType(DjangoObjectType):
    class Meta:
        model = Company

そして最後に、私のミューテーションクラス CreateCompany には、 Currency Country 、および Self(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.

私は長い間、1対多の外部キーの良いチュートリアルを見つけていたので、誰かがこのソリューションをうまく実装する方法を知っていれば、私はとてもうれしいです。

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は、ミューテーションが成功したときに返されるオブジェクト(CompanyTypeオブジェクト)です。これは、companyを作成し、オブジェクトcompanyの応答が必要なためです。

Argumentsクラスとして、通貨、国、または自己(オブジェクト内のオブジェクトのような)などのネストされた入力を持つCompanyInputがあります。

静的メソッドmutateはDjangocreate関数を呼び出し、この作成されたオブジェクトはCompnyTypeである当社のオブジェクトに割り当てられ、これがその応答になります。

(もちろん、作成の前後にビジネスロジックを実装する場合は、create以外の関数を呼び出すことができますが、mutationメソッドは、応答として定義された、または定義された特定のオブジェクトを返す必要があります。私にとっては、CreateCompanyクラスの会社です。もちろん可能です。より多くのオブジェクトまたはオブジェクトのリストになります。それはあなた次第です。)

関連記事

Cypress:3つの異なる応答を持つ同じルートのスタブ応答
コマンドラインからvscodeを強制終了します
Djangoでリストの反復中にインデックスを表示するにはどうすればよいですか?
テンプレート内のdjangoスライス番号
認証なしのDjango管理者