Python 如何为django模型和graphql变异参数使用单个枚举?
我已经用包含对应于枚举的文本选择的字段定义了Django模型。GraphQL API提供了带有enum类型参数的突变(不是直接从模型派生的),该类型参数应仅接受与模型相同的值。我怎样才能摆脱我的怀疑 型号.py:Python 如何为django模型和graphql变异参数使用单个枚举?,python,django,django-models,graphql,graphene-django,Python,Django,Django Models,Graphql,Graphene Django,我已经用包含对应于枚举的文本选择的字段定义了Django模型。GraphQL API提供了带有enum类型参数的突变(不是直接从模型派生的),该类型参数应仅接受与模型相同的值。我怎样才能摆脱我的怀疑 型号.py: class-SomeModel(models.Model): 类SomeEnum(models.TextChoices): A=“A”和“选项A”) B=“B”,u(“选项B”) 枚举_字段=models.CharField( 最大长度=1, choices=SomeEnum.choi
class-SomeModel(models.Model):
类SomeEnum(models.TextChoices):
A=“A”和“选项A”)
B=“B”,u(“选项B”)
枚举_字段=models.CharField(
最大长度=1,
choices=SomeEnum.choices,
默认值=SomeEnum.A,
)
schema.py:
类SomeEnumSchema(graphene.Enum):
A=“A”
B=“B”
类突变(石墨烯突变):
类参数:
some_enum=SomeEnumSchema(必需=True)
您可以使用graphene.Enum.from_Enum()
此函数可以将普通Enum
类型转换为graphene.Enum
请注意,models.TextChoices
仅适用于3.0以上的Dajango版本
models.py(对于Django版本>=3.0)
models.py(适用于Django版本<3.0)
schema.py:
SomeEnumSchema = graphene.Enum.from_enum(SomeEnum)
class SomeMutation(graphene.Mutation):
class Arguments:
some_enum = SomeEnumSchema(required=True)
如果您想在自定义突变中使用Enum,那么可以像这样使用
graphine.Enum
class PermisionEnum(graphene.Enum):
READ = "read"
WRITE = "write"
class SimpleModelMutation(graphene.Mutation):
class Arguments:
# reusable
permission = PermisionEnum(required=True)
# not reusable
scope = graphene.Enum('scope', [
("PERSONAL", "personal"),
("PROJECT", "project")
])(required=True)
我建议使用
permissionenum(required=True)
方法,因为通过它permissionenum
类可以跨不同的变体重用。当您像我在scope
field中那样声明枚举时,这是不可能的 我不知道python。。。将值提取到某个基类,这对两者都是通用的-多重继承?Django>=3.0版本的一个重要注意事项是,每个枚举选项的类变量名必须与元组的第一个元素匹配。这意味着要使用选项a enum的小写键,必须将其写入a=“a”、(“选项a”)
SomeEnumSchema = graphene.Enum.from_enum(SomeEnum)
class SomeMutation(graphene.Mutation):
class Arguments:
some_enum = SomeEnumSchema(required=True)
class PermisionEnum(graphene.Enum):
READ = "read"
WRITE = "write"
class SimpleModelMutation(graphene.Mutation):
class Arguments:
# reusable
permission = PermisionEnum(required=True)
# not reusable
scope = graphene.Enum('scope', [
("PERSONAL", "personal"),
("PROJECT", "project")
])(required=True)