Графен Джанго - Мутация с внешним ключом отношения один ко многим - PullRequest
0 голосов
/ 20 ноября 2018

Я хотел бы знать, как правильно создать мутацию для создания этой модели 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)

Как видите, есть три внешних ключа.Для модели Валюта , Страна и Родитель (сам) . Company DjangoObjectType выглядит очень просто так:

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

И, наконец, мой класс мутаций CreateCompany имеет Валюта , Страна и Self (родительский) определяется как 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, чтобы я знал, как вызвать эту мутацию?Большое спасибо.

1 Ответ

0 голосов
/ 23 апреля 2019

Для тех, кто все еще ищет ответ.

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, какой тип пользователя запрашивать (request).

Тип объектов, указывающий возвращаемый объект, который возвращает мутация, когда все прошло успешно.Поэтому, когда вы просто смотрите на класс CreateCompany, компания - это объект, который будет возвращен в случае успеха мутации (объект CompanyType), потому что мы создаем компанию и хотим получить ответ от объекта компания.

В качестве класса Arguments существует CompanyInput, который имеет вложенные входные данные, такие как валюта, страна или я (это как объект в объекте).

Статический метод mutate вызовет функцию создания Django, и этот созданный объект будет присвоен объекту нашей компании, который является CompnyType, и это будет тот ответ.

(Конечно, вы можете вызвать другую функцию, чемсоздать, если вы хотите реализовать некоторую бизнес-логику до и после создания, но метод мутации должен возвращать определенный объект или объекты, которые были или были определены как ответ. Для меня компания в классе CreateCompany. Конечно, может быть больше объектов или списков объектов.зависит только от вас.)

...