问题描述
刚开始在我的后端使用石墨烯,我有三种类型的用户,他们都有用户名、电子邮件和 user_type,但其他都是可选的。
我没有创建 3 个变异类,而是尝试实现一个通用的 createuser Class
我目前的实现是:
class createuser(graphene.Mutation):
user = graphene.Field(UserType)
class Arguments:
# user = graphene.ID()
email = graphene.String(required=True)
password = graphene.String(required=True)
user_type = graphene.String(required=True)
first_name = graphene.String()
last_name = graphene.String()
street_address = graphene.String()
city = graphene.String()
state = graphene.String()
zip_code = graphene.Int()
date = graphene.Date()
... #so on
def mutate(self,info,email,password,user_type,**kwargs):
user = CustomUser.objects.create(
username=email,email=email,user_type=user_type,password=password,)
... # code where I use kwargs
return createuser(user=user)
QUESTION:
有没有办法在运行时动态创建 class Arguments:
?
解决方法
假设您有三个名为 UserModel1
、UserModel2
和 UserModel3
的用户模型。
如果您的不同用户模型有任何您希望允许更改创建的不同字段,您需要设计输入参数列表以包含所有这些字段,作为可选字段,即
class Arguments:
email = graphene.String(required=True) # common required field
password = graphene.String(required=True) # common required field
user_type = graphene.String(required=True) # required to switch fields
...
user_model1_field = graphene.String() # some field that's only used in `UserModel1` that must be optional
同样,对于输出类型,您可以决定您的输出类型是包含所有用户模型的所有字段,还是仅包含三个不同模型之间的公共字段。
然后,在您的变异方法中,您可以打开用户类型并提供与您做出的输出类型决策一致的输出值。
def mutate(self,info,email,password,user_type,**kwargs):
if user_type == "UserModel1":
# do stuff to create UserModel1 with **kwargs
user = UserModel1.object.create(
... parse kwargs to get UserModel1's fields
return UserType(... parse kwargs and or users fields to created)
elif user_type == "UserModel2":
# similarly create UserModel2 from kwargs
...
elif user_type == "UserModel3":
... etc. etc