首页 > 解决方案 > Django Rest Framework 使用 ChoiceField 读/写 ModelSerializer

问题描述

我的模型“OrderItem”中有几个字段是 ChoiceFields 或 Enums。我想代表选择的标签并使用serializers.CharField(source='get_service_display'). 另请参阅带有 ChoiceField 的 Django Rest 框架

这工作正常,但创建对象不再工作,并出现以下错误消息OrderItem() got an unexpected keyword argument 'get_service_display'

这是我的模型

class OrderItem(TimeStampedModel):
    class Categories(models.IntegerChoices):
        GRASS = (1, _('grass'))

    order = models.ForeignKey(Order, related_name='order_items', on_delete=models.CASCADE)
    unit_price = models.DecimalField(max_digits=6, decimal_places=2)
    category = models.IntegerField(choices=Categories.choices)

这里是我的序列化程序

class OrderItemSerializer(serializers.ModelSerializer):
    id = serializers.IntegerField(required=False)
    category = serializers.CharField(source='get_category_display')

    class Meta:
        model = OrderItem
        fields = ['id', 'unit_price', 'category']
        read_only_fields = ['unit_price']

我怎样才能创建这样的模型?

标签: djangodjango-rest-framework

解决方案


尝试这个:

from rest_framework import fields
from your_app_path.models import Categories

class OrderItemSerializer(serializers.ModelSerializer):
    category = fields.ChoiceField(Categories.choices)

另一个注意事项。我不熟悉仅用于选择的子分类模型。我通常这样做:

class OrderItem(TimeStampedModel):
    GRASS = 'grass'

    CATEGORY_CHOICES = (
        (1, _(GRASS)),
        )

order = models.ForeignKey(Order, related_name='order_items', on_delete=models.CASCADE)
unit_price = models.DecimalField(max_digits=6, decimal_places=2)
category = models.IntegerField(choices=CATEGORY_CHOICES)

推荐阅读