如何在 django rest 框架中为枚举字段创建序列化程序

Posted

技术标签:

【中文标题】如何在 django rest 框架中为枚举字段创建序列化程序【英文标题】:how to create serializer for an enum field in django rest framework 【发布时间】:2017-08-22 15:55:08 【问题描述】:

我正在 python django rest 框架中编写一个 API,我一直在为 ENUM 创建一个序列化器字段,我如何为一个 ENUM 字段创建一个序列化器字段。 我的型号代码是:

class Queue(models.Model):
    class Meta:
        db_table = 'queues'

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False, unique=True)
    name = models.CharField(max_length=45)
    type = EnumChoiceField(QueueTypes, default=QueueTypes.pending)
    date = models.DateTimeField(auto_now=True)

我正在为这个模型编写一个序列化程序。

class QueueSerializer(serializers.ModelSerializer):
    class Meta:
        model = Queue
        fields = ('__all__')

    id = serializers.CharField(read_only=True)
    name = serializers.CharField(max_length=45, required=True)
    type=?????# what am i supposed to do here?
    date = serializers.DateTimeField(read_only=True)

【问题讨论】:

我可以看到 EnumChoiceField 是一个自定义字段。 DRF 也支持定义自定义字段映射,请看这里:django-rest-framework.org/api-guide/fields/#custom-fields 或许有帮助。 是的,它是一个自定义字段,用于在 django 模型中实现 ENUM,谢谢,我会检查链接。 EnumChoiceField 不是 Django 的一部分。它来自哪里? 我遇到了在 model.py 中创建枚举的问题,我通过在 google 上搜索 django-enum 选择字段找到了解决方案,看看link EnumChoiceField 不支持 DRF 的 ModelViewSet 中的 filter_fields。除此之外,它似乎很好。 【参考方案1】:

EnumChoiceField 扩展似乎工作正常,但不正确支持 REST 框架html 支持呈现,序列化为 EnumChoiceField 的字段不会呈现。

【讨论】:

【参考方案2】:

在谷歌上进行了大量搜索后,我终于找到了 EnumchoiceField 序列化问题的答案,以下更改完成了这项工作。

我的Model.py

from enumchoicefield import ChoiceEnum, EnumChoiceField

class QueueTypes(ChoiceEnum):
    appointment = "appointment"
    wait = "wait"
    process = "process"
    pending = "pending"

class Queue(models.Model):
    class Meta:
       db_table = 'queues'

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False, unique=True)
    name = models.CharField(max_length=45)
    type = EnumChoiceField(enum_class=QueueTypes , default=QueueTypes.process)
    date = models.DateTimeField(auto_now=True)
    fk_department = models.ForeignKey(Department, related_name='department',null=True, on_delete=models.CASCADE)

我的Serialize.py

from enumchoicefield import ChoiceEnum, EnumChoiceField

class QueueSerializer(serializers.ModelSerializer):
    class Meta:
        model = Queue
        fields = ('__all__')

    id = serializers.UUIDField(read_only=True)
    name = serializers.CharField(max_length=45, required=True)
    type = EnumChoiceField(enum_class=QueueTypes)
    date = serializers.DateTimeField(read_only=True)

【讨论】:

既然用ModelSerializer,为什么还要声明type=EnumChoiceField(...)?它们不是必需的。对于只读字段,您只需在 Meta 内的read_only_fields = ('id', 'date') 中声明它们

以上是关于如何在 django rest 框架中为枚举字段创建序列化程序的主要内容,如果未能解决你的问题,请参考以下文章

如何在序列化程序 django rest 框架中为外键设置源

令牌身份验证在 Django Rest 框架上不起作用

如何在 django rest 框架中定义列表字段?

如何在rest框架中为我的注册视图编写登录视图?

如何在 Django REST 框架中更改字段名称

如何在 django rest 框架 ModelSerializer 中覆盖模型字段验证