restful专栏 05.自定义序列化类

本文介绍了如何在Django REST框架中创建自定义序列化类,包括分类序列化和商品序列化,详细说明了序列化类的各个字段及方法,如`create`和`update`。同时,展示了用于创建和查看分类及商品的ModelViewSet视图。通过自定义验证和处理逻辑,确保数据的完整性和一致性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

# 01.自定义序列化类

[toc]{type: "ol", level: [2, 3, 4, 5]}

### 自定义序列化类
#### 分类序列化
```python
class CategorySerializer(serializers.Serializer):
    """序列化类决定了模型的序列化细节"""
    id = serializers.IntegerField(read_only=True)
    # 不允许为空白
    name = serializers.CharField(
        allow_blank=False,
        min_length=2,
        max_length=12,
        error_messages={'error': '2 < long < 12'}
    )

    # 重写create方法 定义模型实例的创建方式 对应POST请求
    def create(self, validated_data):
        instance = Category.objects.create(**validated_data)
        return instance

    # 重写update方法 对应PUT请求
    def update(self, instance, validated_data):
        """
        :param instance: 更改之前的实例
        :param validated_data: 数据字典
        :return: 返回值
        """
        instance.name = validated_data.get('name', instance.name)
        instance.save()
        return instance
```
#### 商品序列化
```python
class GoodsSerializer(serializers.Serializer):
    # model中创建时的必填项,必须在此处指定
    name = serializers.CharField(
        min_length=2,
        max_length=20,
        error_messages={
            "min_length": "最少2个字符",
            "error_message": "2 < num < 20"
        }
    )
    category = CategorySerializer(label='分类')

    # 自定义类如果想添加数据,必须重写create方法与validate
    def create(self, validated_data):
        instance = Goods.objects.create(**validated_data)
        return instance

    # 有分类则获取,没有分类则告知:没有分类,并且您没有权限创建分类
    # 将data变成要处理的字段名(category),方便读懂
    def validate_category(self, category):
        try:
            Category.objects.get(name=category['name'])
        except Exception:
            raise serializers.ValidationError('No this category and No permission to create')
        return category

    # validate_category权重高于validate
    def validate(self, attrs):
        # 有分类则获取,没有分类则创建一个分类。从而获取一个实例
        try:
            c = Category.objects.get(name=attrs['category']['name'])
        except Exception:
            c = Category.objects.create(name=attrs['category']['name'])
        attrs['category'] = c
        return attrs

    # 更新数据必须重写update方法
    def update(self, instance, validated_data):
        # 如果收到新数据,就使用新数据,没有收到则使用原来的值
        instance.name = validated_data.get("name", instance.name)
        instance.category = validated_data.get("category", instance.category)
        # 同步数据到数据库
        instance.save()
        return instance
```
<br><br>


### 创建视图
#### 创建分类
```python
### shop.serializer
class CategoryModelViewSet(viewsets.ModelViewSet):
    queryset = Category.objects.all()
    serializer_class = CategorySerializer
```
#### 创建商品
```python
### shop.serializer
class GoodsModelViewSet(viewsets.ModelViewSet):
    """这里是Goods的文档注释"""
    queryset = Goods.objects.all()
    serializer_class = GoodsSerializer
```
![drf](imgs/01.png)
<br><br>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值