Django REST Framework学习(1)

介绍

drf是django项目中为了方便快捷实现前后端分离,并且很好遵循RESTful接口风格所提供的框架或者也可以叫模块,其依赖于django。

优点

优点很多,不一一举例了,django前后端分离项目的好帮手

  • 提供了定义序列化器Serializer的方法,方便序列化/反序列化;
  • 提供了丰富的类视图
  • 身份认证和权限认证
  • 特有的 API web 界面

安装

pip install djangorestframework
因为我的django是1.11.11的,所以我安装的drf版本为3.11.2,版本差异安装时不会报错,但是启动时会有各种问题的话就尝试更换版本

小试

上代码,对比一下传统django做前后端分离和使用drf做前后端分离的差异

此处为传统django实现(新创建一个book子项目)

model

from django.db import models
from django.db import models

#定义图书模型类
class BookInfo(models.Model):
    btitle = models.CharField(max_length=20, verbose_name='名称')
    bpub_date = models.DateField(verbose_name='发布日期')
    bread = models.IntegerField(default=0, verbose_name='阅读量')
    bcomment = models.IntegerField(default=0, verbose_name='评论量')
    is_delete = models.BooleanField(default=False, verbose_name='逻辑删除')

    class Meta:
        db_table = 'tb_books'  # 指明数据库表名
        verbose_name = '图书'  # 在admin站点中显示的名称
        verbose_name_plural = verbose_name  # 显示的复数名称

    def __str__(self):
        """定义每个数据对象的显示信息"""
        return self.btitle

#定义英雄模型类
class HeroInfo(models.Model):
    GENDER_CHOICES = (
        (0, 'male'),
        (1, 'female')
    )
    hname = models.CharField(max_length=20, verbose_name='名称')
    hgender = models.SmallIntegerField(choices=GENDER_CHOICES, default=0, verbose_name='性别')
    hcomment = models.CharField(max_length=200, null=True, verbose_name='描述信息')
    hbook = models.ForeignKey(BookInfo, on_delete=models.CASCADE, verbose_name='图书')  # 外键
    is_delete = models.BooleanField(default=False, verbose_name='逻辑删除')

    class Meta:
        db_table = 'tb_heros'
        verbose_name = '英雄'
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.hname

view

class BookView(View):
	"""
	增删改查
	"""
   def get(self, request, pk):
        # 1、查询数据对象
        try:
            book = BookInfo.objects.get(id=pk)

        except:
            return JsonResponse({'error': '错误信息'}, status=400)

        return JsonResponse(
            {
                'id': book.id,
                'btitle': book.btitle,
                'bread': book.bread,
                'bcomment': book.bcomment,
                'bpub_date': book.bpub_date,
            }
        )

    def put(self, request, pk):
        # 1、获取前端数据
        data = request.body.decode()
        data_dict = json.loads(data)
        # 2、验证数据
        btitle = data_dict.get('btitle')
        bpub_date = data_dict.get('bpub_date')

        if bpub_date is None or bpub_date is None:
            return JsonResponse({'error': '错误信息'}, status=400)
        # 3、更新数据
        try:
            book=BookInfo.objects.get(id=pk)
        except:
            return JsonResponse({'error': '错误信息'}, status=400)

        book.btitle=btitle
        book.bpub_date=bpub_date
        book.save()
        # 4、返回结果
        return JsonResponse(
            {
                'id': book.id,
                'btitle': book.btitle,
                'bread': book.bread,
                'bcomment': book.bcomment,
                'bpub_date': book.bpub_date,
            }
        )

    def delete(self, request, pk):
        # 1、查询数据对象
        try:
            book = BookInfo.objects.get(id=pk)

        except:
            return JsonResponse({'error': '错误信息'}, status=400)

        book.is_delete=True
        book.save()
        return JsonResponse({})

url

urlpatterns = [
    url(r'^books/(?P<pk>\d+)/$', views.BookView.as_view()),
]

结果展示

{
    "id": 1,
    "btitle": "三国演义",
    "bread": 89,
    "bcomment": 110,
    "bpub_date": "2021-07-03"
}
此处为drf实现(新创建一个book_drf子项目)

因为drf核心功能之一就是帮我们减轻了序列化和反序列化的工作,我们只需要自定义一个序列化的类,图片所示的位置新建一个python文件serializer.py
在这里插入图片描述
内容如下
serializer

from rest_framework import serializers


# 自定义序列化器
class BookSerialzier(serializers.Serializer):
    # 此处是你先要返回字段内容,注意字段名和字段类型,字段名和数据库字段名保持一致,字段类型也是如此
    btitle = serializers.CharField()
    bread = serializers.IntegerField()
    bpub_date = serializers.DateField()

view

from django.http import JsonResponse
from django.views import View
from book_drf.serializer import BookSerialzier
from books.models import BookInfo


class Books(View):

    def get(self,request):
        # 1、查询所有图书对象
        books = BookInfo.objects.all()

        ser = BookSerialzier(books, many=True)

        return JsonResponse(ser.data, safe=False)

url

from django.conf.urls import url
from django.contrib import admin
from . import views
urlpatterns = [
    url(r'^books_drf/$', views.Books.as_view()),
]

结果展示

[
    {
        "btitle": "三国演义",
        "bread": 89,
        "bpub_date": "2021-07-03"
    },
    {
        "btitle": "西游记",
        "bread": 99,
        "bpub_date": "2021-07-01"
    },
    {
        "btitle": "水浒传",
        "bread": 79,
        "bpub_date": "2021-05-01"
    }
]
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值