Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何为django模型和graphql变异参数使用单个枚举?_Python_Django_Django Models_Graphql_Graphene Django - Fatal编程技术网

Python 如何为django模型和graphql变异参数使用单个枚举?

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

我已经用包含对应于枚举的文本选择的字段定义了Django模型。GraphQL API提供了带有enum类型参数的突变(不是直接从模型派生的),该类型参数应仅接受与模型相同的值。我怎样才能摆脱我的怀疑

型号.py

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)