Создание объекта с несколькими отношениями в graphene django
Привет ребята, у меня есть следующие модели в моем проекте
class User(AbstractUser):
email = models.EmailField(_('email address'), unique=True, blank=False, null=False)
username = None
first_name = None
last_name = None
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = []
# set custom manager
objects = UserManager()
def __str__(self):
return self.email
class customer(models.Model):
user = models.OneToOneField("users.User", verbose_name=_("customer user account"), on_delete=models.CASCADE)
# general info
first_name = models.CharField(_('customer first name'), max_length=100, help_text='customer first name')
last_name = models.CharField(_('customer last name'), max_length=100, help_text='customer last name')
# addresses info
addresses = models.ManyToManyField('users.address', verbose_name=_('customer addresses'), related_name='customer_addresses', blank=True)
default_shipping_address = models.ForeignKey('users.address', verbose_name=_('default shipping address'), on_delete=models.SET_NULL, null=True, blank=True, related_name='default_shipping')
class address(models.Model):
street_1 = models.CharField(_('street address 1'), max_length=250, help_text='street address one')
street_2 = models.CharField(_('street address 2'), null=True, blank=True, max_length=250, help_text='street address two')
postal_code = models.IntegerField(_('address zipcode'), help_text='address zipcode')
city = models.CharField(_('address city'), max_length=100, help_text='address city')
state = models.CharField(_('address state'), max_length=50, help_text='address state')
country = models.CharField(_('address country'), max_length=100, help_text='address country')
Вот моя текущая реализация создания мутации клиента
class CreateCustomer(graphene.Mutation):
customer = graphene.Field(CustomerType)
class Arguments:
email = graphene.String(required=True)
first_name = graphene.String(required=True)
last_name = graphene.String(required=True)
password = graphene.String(required=True)
phone = graphene.String(required=True)
street_1 = graphene.String(required=False)
street_2 = graphene.String(required=False)
city = graphene.String(required=False)
state = graphene.String(required=False)
zipcode = graphene.String(required=False)
country = graphene.String(required=False)
def mutate(self, info, email, first_name, last_name, password, phone, street_1=None, street_2=None, city=None, state=None, zipcode=None, country=None):
user = User.objects.create_user(
email=email,
password = password
)
user.save()
current_customer = customer.objects.create(
user = user,
first_name = first_name,
last_name = last_name,
phone_number = phone,
email_address = email
)
if street_1:
customer_address = address.objects.create(
street_1 = street_1,
street_2 = street_2,
city = city,
state = state,
postal_code = zipcode,
country = country,
)
customer_address.save()
current_customer.addresses.add(customer_address)
current_customer.save()
return CreateCustomer(customer=current_customer)
Есть ли способ упростить эту мутацию, используя другие типы объектов? У меня есть типы для пользователя и адреса, поэтому, возможно, я могу использовать эти типы для упрощения запроса, я также хотел бы иметь возможность добавлять несколько адресов из одной мутации
Одна большая проблема, с которой я столкнулся в этой реализации, заключается в том, что когда я добавляю адрес к клиенту, мне нужно проверить, что все поля присутствуют, но я не могу требовать этого, потому что я также хотел бы, чтобы весь адрес был необязательным, поэтому что-то вроде добавления списка адресов со списком мутаций было бы моим лучшим вариантом, но я не знаю, как реализовать это в graphene, я новичок в graphql, поэтому это может быть вообще невозможно
Заранее спасибо