DRF基本使用

drf基本使用

执行pip install djangorestframework安装drf

简单实例

获取所有数据

DrfProject->urls.py

from django.contrib import admin
from django.urls import path, include


urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('bookstore.urls')),
]

bookstore->urls.py

from django.contrib import admin
from django.urls import path, include

from bookstore import views

urlpatterns = [
    path('books/', views.BookView.as_view()),
]

views.py

from django import http
from django.shortcuts import render

# Create your views here.
from django.views import View

from bookstore.models import Book


class BookView(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,
                "publish":book.publish,
                "comment":book.comment,
                "read":book.read,
            }
            book_list.append(book_dict)
        return http.JsonResponse(book_list,safe=False)

JsonResponse(book_list,safe=False)为什么加safe=False?

查看源码可知,safe默认时且非dict类型时会抛出TypeError异常

def __init__(self, data, encoder=DjangoJSONEncoder, safe=True,
             json_dumps_params=None, **kwargs):
    if safe and not isinstance(data, dict):
        raise TypeError(
            'In order to allow non-dict objects to be serialized set the '
            'safe parameter to False.'
        )

新增一个数据

**注意:**post请求url结尾加上’/’ http://127.0.0.1:8000/books/

views.py

import json

from django import http
from django.shortcuts import render

# Create your views here.
from django.views import View

from DrfProject import settings
from bookstore.models import Book


class BookView(View):
    def post(self,request):
        """新增数据"""
        #1.获取参数
        dict_data=json.loads(request.body.decode())# json(字符串)转dict

        # print(request.body.decode())# 字节utf8编码后(汉字)
        # print(request.body)# 字节

        # 参数会在数据校验中用到,这里数据校验省略
        title=dict_data.get('title')
        publish=dict_data.get('publish')
        comment=dict_data.get('comment')
        read=dict_data.get('read')

        # 2.数据校验(省略)

        # 3.数据入库
        book=Book.objects.create(**dict_data)

        # 4.返回响应
        book_dict={
            'id':book.id,
            'title':book.title,
            'publish':book.publish,
            'read':book.read,
            'comment':comment
        }
        return http.JsonResponse(book_dict)

settings.py

APPEND_SLASH=False # url get请求结尾要加'/' post请求结尾要加'/'
# APPEND_SLASH=True# 这是默认 post请求结尾要加'/'

获取单个实例

views.py

class BookDetailView(View):
    def get(self,request,pk):
        # 1.获取对象
        book=Book.objects.get(pk=pk)
        # 2.返回响应
        book_dict = {
            'id': book.id,
            'title': book.title,
            'publish': book.publish,
            'read': book.read,
            'comment': book.comment,
        }
        return http.JsonResponse(book_dict)

urls.py

urlpatterns = [
    path('books/', views.BookView.as_view()),
    path('books/<int:pk>', views.BookDetailView.as_view()),
]

更改单个实例

views.py

class BookDetailView(View):
    def put(self,request,pk):
        # 1.获取数据
        dict_data = json.loads(request.body.decode())
        # 2.更改数据库
        Book.objects.filter(pk=pk).update(**dict_data)# 更改操作
        book = Book.objects.get(pk=pk)# 获取更改之后的对象
        book_dict = {# 返回更改后的结果
            'id': book.id,
            'title': book.title,
            'publish': book.publish,
            'read': book.read,
            'comment': book.comment,
        }
        # 3.返回响应
        return http.JsonResponse(book_dict)

删除单个实例

class BookDetailView(View):
    def delete(self,request,pk):
        # 1.获取要删除的对象
        book=Book.objects.get(pk=pk)
        book_dict = {
            'id': book.id,
            'title': book.title,
            'publish': book.publish,
            'read': book.read,
            'comment': book.comment,
        }
        # 2.执行删除
        book.delete()
        # 3.返回响应
        # book_dict初始化放在这里会使id=null
        return http.JsonResponse(book_dict,status=204)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值