📌  相关文章
📜  序列化程序中的数字字段 – Django REST 框架(1)

📅  最后修改于: 2023-12-03 15:09:47.371000             🧑  作者: Mango

序列化程序中的数字字段 – Django REST 框架

在使用 Django REST Framework 进行序列化时,经常会涉及到数字字段的序列化和反序列化。在本文中,我们将介绍如何在 Django REST Framework 中使用数字字段。

序列化数字字段

在 Django REST Framework 中,我们可以使用 IntegerFieldDecimalField 对数字字段进行序列化。

from rest_framework import serializers

class ProductSerializer(serializers.Serializer):
    id = serializers.IntegerField()
    price = serializers.DecimalField(max_digits=6, decimal_places=2)

在上面的代码中,我们定义了一个 ProductSerializer,其中包含了 idprice 两个字段。其中,id 是整数类型,price 是一个最多由六个数字组成,保留两位小数的小数类型。

IntegerField

IntegerField 可以序列化整数类型的字段。当接收一个整数时,它不做任何操作。但是,如果接收到的是一个字符串类型的数字,它会尝试将其转换为整数类型。

class ProductSerializer(serializers.Serializer):
    id = serializers.IntegerField()

在上面的代码中,我们定义了一个 ProductSerializer,其中包含了 id 字段。如果我们在序列化时提供一个整数值,该值将被直接序列化。

serializer = ProductSerializer(data={'id': 1})
serializer.is_valid() # True

data = serializer.data
data # {'id': 1}

同样地,如果我们提供一个字符串类型的数字时,该值将被转换为一个整数类型。

serializer = ProductSerializer(data={'id': '1'})
serializer.is_valid() # True

data = serializer.data
data # {'id': 1}
DecimalField

DecimalField 可以序列化小数类型的字段。当接收一个小数类型时,它不做任何操作。但是,如果接收到的是一个字符串类型的数字,它会尝试将其转换为小数类型。

class ProductSerializer(serializers.Serializer):
    price = serializers.DecimalField(max_digits=6, decimal_places=2)

在上面的代码中,我们定义了一个 ProductSerializer,其中包含了 price 字段。如果我们在序列化时提供了一个小数类型的值,该值将被直接序列化。

serializer = ProductSerializer(data={'price': 10.99})
serializer.is_valid() # True

data = serializer.data
data # {'price': 10.99}

同样地,如果我们提供一个字符串类型的数字时,该值将被转换为一个小数类型。

serializer = ProductSerializer(data={'price': '10.99'})
serializer.is_valid() # True

data = serializer.data
data # {'price': 10.99}
反序列化数字字段

在 Django REST Framework 中,我们可以使用 IntegerFieldDecimalField 对数字字段进行反序列化。

from rest_framework import serializers

class ProductSerializer(serializers.Serializer):
    id = serializers.IntegerField()
    price = serializers.DecimalField(max_digits=6, decimal_places=2)

在上面的代码中,我们定义了一个 ProductSerializer,其中包含了 idprice 两个字段。其中,id 是整数类型,price 是一个最多由六个数字组成,保留两位小数的小数类型。

IntegerField

IntegerField 可以反序列化整数类型的字段。当接收一个整数时,它不做任何操作。但是,如果接收到的是一个字符串类型的数字,它会尝试将其转换为整数类型。

class ProductSerializer(serializers.Serializer):
    id = serializers.IntegerField()

serializer = ProductSerializer(data={'id': 1})
serializer.is_valid() # True

data = serializer.validated_data
data # {'id': 1}

同样地,如果我们提供一个字符串类型的数字时,该值将被转换为一个整数类型。

serializer = ProductSerializer(data={'id': '1'})
serializer.is_valid() # True

data = serializer.validated_data
data # {'id': 1}

如果提供的值不是一个数字,那么将会抛出一个异常。

serializer = ProductSerializer(data={'id': 'abc'})
serializer.is_valid() # False

serializer.errors # {'id': [ErrorDetail(string='A valid integer is required.', code='invalid')]}
DecimalField

DecimalField 可以反序列化小数类型的字段。当接收一个小数类型时,它不做任何操作。但是,如果接收到的是一个字符串类型的数字,它会尝试将其转换为小数类型。

class ProductSerializer(serializers.Serializer):
    price = serializers.DecimalField(max_digits=6, decimal_places=2)

serializer = ProductSerializer(data={'price': 10.99})
serializer.is_valid() # True

data = serializer.validated_data
data # {'price': Decimal('10.99')}

同样地,如果我们提供一个字符串类型的数字时,该值将被转换为一个小数类型。

serializer = ProductSerializer(data={'price': '10.99'})
serializer.is_valid() # True

data = serializer.validated_data
data # {'price': Decimal('10.99')}

如果提供的值不是一个数字,那么将会抛出一个异常。

serializer = ProductSerializer(data={'price': 'abc'})
serializer.is_valid() # False

serializer.errors # {'price': [ErrorDetail(string='Enter a number.', code='invalid')]}
总结

在本文中,我们介绍了在 Django REST Framework 中如何序列化和反序列化数字字段。当你在开发 Django REST Framework 应用程序时,这些技巧将非常有用。