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

2024-10-06 10:34:30 发布

您现在位置:Python中文网/ 问答频道 /正文

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

型号.py

class SomeModel(models.Model):

    class SomeEnum(models.TextChoices):

        A = "A", _("Option A")
        B = "B", _("Option B")

    enum_field = models.CharField(
        max_length=1,
        choices=SomeEnum.choices,
        default=SomeEnum.A,
    )

schema.py


class SomeEnumSchema(graphene.Enum):

    A = "A"
    B = "B"


class SomeMutation(graphene.Mutation):

    class Arguments:
        some_enum = SomeEnumSchema(required=True)


Tags: djangopy模型文本类型参数定义models
2条回答

您可以使用graphene.Enum.from_enum()

此函数可以将正常的Enum类型转换为graphene.Enum

请注意models.TextChoices仅适用于3.0以上的Dajango版本

models.py(适用于Django版本>;=3.0)

from django.db import models

class SomeModel(models.Model):

    class SomeEnum(models.TextChoices):

        A = "A", _("Option A")
        B = "B", _("Option B")

    enum_field = models.CharField(
        max_length=1,
        choices=SomeEnum.choices,
        default=SomeEnum.A,
    )

models.py(适用于Django版本<;3.0)

from enum import Enum
class SomeEnum(Enum):
    A = "A"
    B = "B"

schema.py:

SomeEnumSchema = graphene.Enum.from_enum(SomeEnum)
class SomeMutation(graphene.Mutation):
    class Arguments:
        some_enum = SomeEnumSchema(required=True)

如果您想在自定义突变中使用枚举,那么可以像这样使用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)

我建议使用PermisionEnum(required=True)方法,因为有了它PermisionEnum类可以跨不同的突变重用。当您像我对scope文件那样声明枚举时,这是不可能的

相关问题 更多 >