如何为 django rest framework DecimalField 序列化程序提供选择?

How to provide choices to django rest framework DecimalField serializer?

Django==2.2.6

djangorestframework==3.10.3

Models.py

VAT_CHOICES = [(Decimal('0.00'), '0%'), (Decimal('6.00'), '6%'), (Decimal('12.00'), '12%'), (Decimal('25.00'), '25%')]
class Service(models.Model):
    vat = models.DecimalField(verbose_name=_('vat'), decimal_places=2, max_digits=10, choices=VAT_CHOICES)

serializers.py

class ServiceSerializer(serializers.ModelSerializer):
    vat = serializers.DecimalField(decimal_places=2, max_digits=10, coerce_to_string=True)

如果我这样做,那么响应中的 vat 值将按预期在 srting 中,但选择验证并不暗示。

现在我可以使用 vat="5.00" 创建一个服务,这应该是不可能的,因为模型中有一个选择列表。

我怎样才能拥有小数字段 vat 的字符串表示,同时保持选择验证?

我想这对你有帮助

from rest_framework import serializers
from django.core.validators import DecimalValidator

class ServiceSerializer(serializers.ModelSerializer):
    vat = serializers.ChoiceField(choices=[(Decimal('0.00'), '0%'), (Decimal('6.00'), '6%'), (Decimal('12.00'), '12%'),
                                           (Decimal('25.00'), '25%')], validators=[DecimalValidator(max_digits=10, decimal_places=2)])

    def to_representation(self, instance):
        data = super(ServiceSerializer, self).to_representation(instance)
        data.update(vat=str(instance.vat))
        return data

我认为没有必要验证 max_digits 和 decimal_places 因为选择不会接受除

之外的其他值
choices=[(Decimal('0.00'), '0%'), (Decimal('6.00'), '6%'), (Decimal('12.00'), '12%'),('25.00'), '25%')