как использовать настраиваемую мутацию регистров с django-graphql-auth

django-graphql-auth - отличный пакет, но в документации мало говорится об ассоциации моделей с пользовательской моделью.

Я ищу возможность использовать этот пакет с настраиваемой мутацией регистра для обоих типов пользователей: заявитель и работодатель.


class User(AbstractUser):
    email = models.EmailField(blank=False,
                              max_length=255,
                              verbose_name="email address")
    is_applicant = models.BooleanField(default=False)
    is_employer = models.BooleanField(default=False)

    USERNAME_FIELD = "username"
    EMAIL_FIELD = "email"


class Applicant(models.Model):
    user = models.OneToOneField(
        User,
        on_delete=models.CASCADE,
        primary_key=True,
    )
    fullname = models.CharField(max_length=255, null=True)


class Employer(models.Model):
    user = models.OneToOneField(
        User,
        on_delete=models.CASCADE,
        primary_key=True,
    )
    company_name = models.CharField(max_length=225, null=True)

Цель мутации:

mutation {
  registerApplicant(
    input: {
      email: "[email protected]",
      username: "new_applicant",
      password1: "createsuperpassword",
      password2: "createsuperpassword",
      isApplicant: true,
      applicant {
        fullname: "New Applicant"
      }
    }
  ) {
    success,
    errors,
    token,
    refreshToken
  }
}

mutation {
  registerEmployer(
    input: {
      email: "[email protected]",
      username: "new_employer",
      password1: "createsuperpassword",
      password2: "createsuperpassword",
      isEmployer: true,
      employer {
        fullname: "New Employer"
      }
    }
  ) {
    success,
    errors,
    token,
    refreshToken
  }
}


person seddka    schedule 08.07.2020    source источник


Ответы (1)


Вы можете проделать весь этот процесс с помощью только graphql_jwt, сначала вам нужно будет определить ввод; нравится:

class ApplicantInfoInput(graphene.InputObjectType):
    email = graphene.String(required=True)
    username = graphene.String(required=True)
    password1 = graphene.String(required=True)
    password2 = graphene.String(required=True)
    is_applicant = graphene.Boolean(required=True)
    fullname = graphene.String(required=True)

Тогда класс мутации должен выглядеть примерно так:

from graphql_jwt.shortcuts import get_token, create_refresh_token
from ..models import User, Applicant

class UserCreateMutation(graphene.Mutation):
    user = graphene.Field(UserType)
    success = graphene.Boolean()
    token = graphene.String()
    refresh_token = graphene.String()

    class Arguments:
        input = ApplicantInfoInput(required=True)

    @staticmethod
    def mutate(root, info, input=None):
        try:
            user = User.objects.get(username=input.username)
        except User.DoesNotExist as e:
            user = None

        if user:
            raise Exception('User Already Exists!')
        else:
            user_instance = Applicant(fullname=input.fullname)
            user_instance.user.email = input.email
            user_instance.user.set_password(input.password1)
            user_instance.user.is_applicant = True
            user_instance.save()
            token = get_token(user_instance)
            refresh_token = create_refresh_token(user_instance)
            return UserCreateMutation(user=user_instance,
                                      token=token,
                                      refresh_token=refresh_token,
                                      success=True)
person Booshra    schedule 26.07.2020