Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.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
如何在django rest框架中为枚举字段创建序列化程序_Django_Django Models_Django Rest Framework_Python 3.6_Django Serializer - Fatal编程技术网

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

如何在django rest框架中为枚举字段创建序列化程序,django,django-models,django-rest-framework,python-3.6,django-serializer,Django,Django Models,Django Rest Framework,Python 3.6,Django Serializer,我正在用python django rest框架编写一个API,我一直在为枚举创建序列化器字段,如何为枚举字段创建序列化器字段。 我的型号代码是: class Queue(models.Model): class Meta: db_table = 'queues' id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False, unique=True) name =

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

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序列化问题的答案。以下更改完成了这项工作

myModel.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)
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)
mySerialize.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)
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)

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

我可以看到EnumChoiceField是一个自定义字段。DRF还支持定义自定义字段映射,请看这里:可能有帮助。是的,这是一个自定义字段,用于django模型中ENUM的实现,谢谢我查看链接。
EnumChoiceField
不是django的一部分。它从何而来?我在model.py中创建了一个枚举。我通过在google上搜索django enum choicefield找到了一个解决方案,看看不支持DRF的
ModelViewSet
中的
filter\u字段。除此之外,似乎还可以。既然您使用的是
ModelSerializer
,为什么还要声明
type=enumcoocefield(…)
?它们不是必需的。对于只读字段,您只需要在元数据中的
read_only_fields=('id','date')
中声明它们