如何在 Django Rest Framework 中为枚举字段创建序列化器

15

我正在使用Python Django Rest Framework编写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)

1
我可以看到EnumChoiceField是一个自定义字段。DRF也支持定义自定义字段映射, 可以在这里查看:http://www.django-rest-framework.org/api-guide/fields/#custom-fields 也许对你有所帮助。 - Bogdan Iulian Bursuc
是的,它是为在Django模型中实现ENUM而定义的自定义字段。谢谢,我会查看链接。 - nick
EnumChoiceField 不是 Django 的一部分。它来自哪里? - Linovia
我曾经在model.py中创建枚举的时候遇到了问题,但是通过在谷歌上搜索,我找到了解决方案,即使用django-enum choicefield。请查看链接 - nick
EnumChoiceField 在 DRF 的 ModelViewSet 中不支持 filter_fields。除此之外,看起来还可以。 - John Pang
2个回答

10

在谷歌上做了很多搜索后,我终于找到了解决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)

3
既然你正在使用ModelSerializer,那么为什么还要声明type=EnumChoiceField(...)?这是不必要的。对于只读字段,你只需要在Meta中声明read_only_fields = ('id', 'date')即可。 - John Pang

3
EnumChoiceField 扩展似乎工作正常,但不正确地支持 REST Framework 的 HTML 支持渲染,序列化为 EnumChoiceField 的字段未被呈现。"最初的回答"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接