DRF学习笔记(一)运用Django实现DRF功能

(一)项目结构
在这里插入图片描述

(一)创建数据库模型booktest/models.py

from django.db import models


class Book(models.Model):
    id = models.AutoField(primary_key=True)  # id 会自动创建,可以手动写入
    title = models.CharField(max_length=32)  # 书籍名称
    # DecimalField用来限制数字大小,max_digits=5表示价格最大为五位数(包括了小数部分),decimal_places=2表示存储数字到小数点后2位
    # 所以最大的价格就为:999.99
    price = models.DecimalField(max_digits=5, decimal_places=2)  # 书籍价格
    publish = models.CharField(max_length=32)  # 出版社名称
    pub_date = models.DateField()  # 出版时间

(二)数据库中手动添加几条数据用于测试
在这里插入图片描述
(三)booktest/views.py

import json

from django.views import View
from .models import Book
from django.http import JsonResponse, HttpResponse


class BookListView(View):
    """列表视图"""

    def get(self, request):
        """查询所有图书接口"""
        # 1.查询所有图书模型
        books = Book.objects.all()
        # 2.遍历所有查询集,取出里面每个书籍模型对象,把模型对象转化成字典
        book_list = []
        for book in books:
            book_dict = {
                'id': book.id,
                'title': book.title,
                'price': book.price,
                'publish': book.publish,
                'pub_date': book.pub_date
            }
            book_list.append(book_dict)
        # 3.响应
        # safe=False的作用当safe=True并且所传过来的data不是dict类型时,会引发异常,
        # 提醒我们如果传过来的objects不是dict,将safe参数设置为False,就允许传非字典数据.
        return JsonResponse(book_list, safe=False)

    def post(self, request):
        """新增图书接口"""
        # 获取前端传入的请求体数据(json) 用request.body获取
        json_str_bytes = request.body
        # 把bytes类型的json字符串转换成json_str
        json_str = json_str_bytes.decode()
        # 利用json.loads将json字符串转换成json(字典/列表)
        book_dict = json.loads(json_str)
        # 创建模型对象并保存(把字典转换成模型并存储)
        book = Book(
            title=book_dict['title'],
            price=book_dict['price'],
            publish=book_dict['publish'],
            pub_date=book_dict['pub_date']
        )
        # 保存模型
        book.save()
        # 把新增的模型转换成字典
        json_dict = {
            'id': book.id,
            'title': book.title,
            'price': book.price,
            'publish': book.publish,
            'pub_date': book.pub_date
        }
        # 响应(把新增的数据再响应回去,201)
        return JsonResponse(json_dict, status=201)


class BookDetailView(View):
    """详情视图"""

    def get(self, request, pk):
        """查询指定某个图书接口"""
        # 取出指定pk的那个模型对象
        try:
            book = Book.objects.get(id=pk)
        except Book.DoesNotExist:
            return HttpResponse({'message': '查询的数据不存在'}, status=404)
        # 模型对象转字典
        book_dict = {
            'id': book.id,
            'title': book.title,
            'price': book.price,
            'publish': book.publish,
            'pub_date': book.pub_date
        }
        # 3、响应
        return JsonResponse(book_dict)

    def put(self, request, pk):
        """修改指定图书接口"""
        # 先查询要修改的模型对象
        try:
            book = Book.objects.get(id=pk)
        except Book.DoesNotExist:
            return HttpResponse({'message': '要修改的数据不存在'}, status=404)
        # 获取前端传入的新数据(把数据转换成字典)
        json_str_bytes = request.body
        json_str = json_str_bytes.decode()
        book_dict = json.loads(json_str)
        # book_dict=json.loads(request.body.decode())
        # 重新给模型指定的属性赋值
        book.title = book_dict['title']
        book.price = book_dict['price']
        book.publish = book_dict['publish']
        book.pub_date = book_dict['pub_date']
        # 调用save方法进行修改操作
        book.save()
        # 把修改后的模型再转换成字典
        json_dict = {
            "id": book.id,
            "title": book.title,
            "price": book.price,
            "publish": book.publish,
            "pub_date": book.pub_date
        }
        # 响应
        return JsonResponse(json_dict)

    def delete(self, request, pk):
        """删除指定书籍接口"""
        # 获取要删除的模型对象
        try:
            book = Book.objects.get(id=pk)
        except Book.DoesNotExist:
            return HttpResponse({'message': '要删除的数据不存在'}, status=404)
        # 删除模型对象
        book.delete()  # 物理删除(真正从数据库删除)
        # book.is_delete = True
        # book.save()  # 逻辑删除
        # 响应:删除时不需要有响应体但要指定状态码为204
        return HttpResponse(status=204)
# 模型变成字典称为序列化(输出的过程)
# 字典变为模型称为反序列化(输入的过程)
# 以上的输入输出时对于数据库而言

(四)路由设置
booktest/urls.py

from django.conf.urls import url

from . import views

urlpatterns = [
    # 列表视图的路由
    url(r'^books/$', views.BookListView.as_view()),
    # 详情视图的路由
    url(r'^books/(?P<pk>\d+)/$', views.BookDetailView.as_view())
]

demo/urls.py

"""demo URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/3.1/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path
from django.conf.urls import url, include

urlpatterns = [
    url(r'^', include('booktest.urls'))  # 书籍模块
]

(五)postman测试接口
①查询所有书籍
在这里插入图片描述
②查询指定书籍
在这里插入图片描述
③新增书籍
在这里插入图片描述
④修改指定书籍
在这里插入图片描述
⑤删除指定书籍
在这里插入图片描述
(六)DRF的安装
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值