【DRF】Django Rest Framework(4.DRF中的模型类序列化器-ModelSerializer)

1. Serializer 写法

# 针对模型,设计序列化器
class BookSerializers(serializers.Serializer):
    title = serializers.CharField(max_length=32)
    price = serializers.IntegerField()
    date = serializers.DateField(source='pub_date')

    # 重写或者说是,实现create()方法
    def create(self, validated_data):
        new_book = Book.objects.create(**self.validated_data)
        return new_book

    def update(self, instance, validated_data):
        Book.objects.filter(pk=instance.pk).update(**self.validated_data)
        update_book = Book.objects.get(pk=instance.pk)
        return update_book

2. ModelSerializer 写法(模型类序列化器)

class BookSerializers(serializers.ModelSerializer):
    class Meta:
        model = Book
(1) 优点
  • 写法很简单
  • 覆盖了各种字段,包括一对多,多对多字段
  • 生成了序列化的字段
  • 自动写好了 create() update(),并且考虑了各种各样的方法
(2) 缺点

形成了强耦合,不灵活

(3) 完整代码
from django.http import HttpResponse
from django.shortcuts import render
from rest_framework.views import APIView
from sers.models import Book

from rest_framework import serializers
from rest_framework.response import Response


# 针对模型,设计序列化器
# class BookSerializers(serializers.Serializer):
#     title = serializers.CharField(max_length=32)
#     price = serializers.IntegerField()
#     date = serializers.DateField(source='pub_date')
#
#     # 重写或者说是,实现create()方法
#     def create(self, validated_data):
#         new_book = Book.objects.create(**self.validated_data)
#         return new_book
#
#     def update(self, instance, validated_data):
#         Book.objects.filter(pk=instance.pk).update(**self.validated_data)
#         update_book = Book.objects.get(pk=instance.pk)
#         return update_book

class BookSerializers(serializers.ModelSerializer):
    # 单独配置的,单独写就行,但是会多加一个,同类型同约束的名称
    date = serializers.DateField(source='pub_date')

    class Meta:
        model = Book
        # fields = ["title", "price"]     # 只要哪些字段
        fields = "__all__"    # 返回全部的字段,包括id
        # 注意: fields 和 exclude 只能出现一个
        # exclude = ['pub_date']    # 不返回哪个字段


class BookView(APIView):

    # 查所有
    def get(self, request):
        # 获取所有的书籍
        book_list = Book.objects.all()
        # 构建序列化器对象    BookSerializers(instance=,data=,many=)
        # instance,是用来做序列化器的
        # data,是用来做反序列化器的
        # many, 序列化的是一个模型类对象还是多个模型类对象, True/Falseid
        serializer = BookSerializers(instance=book_list, many=True)
        return Response(serializer.data)

    # 增加一个
    def post(self, request):
        # 获取参数
        data = request.data

        #  构建序列化器对象
        serializer = BookSerializers(data=data)

        # 校验数据
        # 校验原理:
        # 1.所有符合的数据都放在,serializer.validated_data
        # 2.不符合数据的都放在,serializer.errors
        if serializer.is_valid():  # 返回一个布尔值,所有字段都符合才返回True,反之,返回False
            # 数据校验通过,存入数据库中
            # new_book = Book.objects.create(**serializer.validated_data)

            serializer.save()

            return Response(serializer.data)
        else:
            # 数据校验失败
            return Response(serializer.errors)


class BookDetailsView(APIView):

    # 查一个
    def get(self, request, id):
        book = Book.objects.get(pk=id)
        serializer = BookSerializers(instance=book)
        return Response(serializer.data)

    def put(self, request, id):
        book = request.data
        update_book = Book.objects.get(pk=id)
        # 构建序列化器对象
        serializer = BookSerializers(instance=update_book, data=book)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        else:
            return Response(serializer.errors)

    def delete(self, request, id):
        Book.objects.get(pk=id).delete()
        return Response()

postman调用结果
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

还是那个同伟伟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值