如何使用django开发一个标准rest接口

1. models.py代码

from django.db import models


class BookInfo(models.Model):
    btitle = models.CharField(max_length=50, verbose_name="标题")
    bcontent = models.TextField(verbose_name="内容")
    bread = models.IntegerField(verbose_name="阅读量", default=0)
    bprice = models.DecimalField(verbose_name="价格", max_digits=6, decimal_places=2, default=20)
    bpub_date = models.DateTimeField(verbose_name="发布日期", auto_now_add=True)
    is_delete = models.BooleanField(verbose_name="删除标记", default=False)

    image = models.ImageField(upload_to="books/%Y/%m", verbose_name="图片", max_length=100, null=True, blank=True)

    def __str__(self):
        return self.btitle

    class Meta:
        verbose_name = "图书信息"
        verbose_name_plural = verbose_name

2. views.py代码

from django.shortcuts import HttpResponse
from django.http import JsonResponse
from django.views.generic.base import View
from .models import BookInfo
import json


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

    def get(self, request):
        """获取所有图书"""
        # 1. 查询所有图书
        books = BookInfo.objects.all()
        # 2. 将查到的所有图书序列化成字典
        books_list = []
        for book in books:
            book_dict = {
                "id": book.id,
                "btitle": book.btitle,
                "bcontent": book.bcontent,
                "bread": book.bread,
                "bprice": book.bprice,
                "bpub_date": book.bpub_date,
                "image": book.image.url if book.image else "",  # None.url会报错,所以用个if
            }
            books_list.append(book_dict)
        # 3. 返回应答
        return JsonResponse(books_list, safe=False)

    def post(self, request):
        """新增一本图书"""
        # 获取前端传入的请求体数据
        json_str = request.body.decode("utf-8")
        # 将json字符串转换为字典
        book_dict = json.loads(json_str)
        book = BookInfo(
            btitle=book_dict["btitle"],
            bcontent=book_dict["bcontent"],
        )
        book.save()

        # 把新增的实例对象转换成字典
        book_dict = {
            "id": book.id,
            "btitle": book.btitle,
            "bcontent": book.bcontent,
            "bread": book.bread,
            "bprice": book.bprice,
            "bpub_date": book.bpub_date,
            "image": book.image.url if book.image else "",  # None.url会报错,所以用个if
        }

        # 把新增的数据响应回去,状态码201
        return JsonResponse(book_dict, status=201)


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

    def get(self, request, pk):
        """获取一书详情"""
        # 获取模型对象
        try:
            book = BookInfo.objects.get(id=pk)
        except BookInfo.DoesNotExist:
            return HttpResponse({"msg": "要查询的数据不存在"}, status=404)
        # 对象转字典
        book_dict = {
            "id": book.id,
            "btitle": book.btitle,
            "bcontent": book.bcontent,
            "bread": book.bread,
            "bprice": book.bprice,
            "bpub_date": book.bpub_date,
            "image": book.image.url if book.image else "",  # None.url会报错,所以用个if
        }
        # 响应
        return JsonResponse(book_dict)

    def put(self, request, pk):
        """修改一本图书"""
        # 1. 获取要更新的实例对象
        book_query = BookInfo.objects.filter(id=pk)
        if book_query:
            book = book_query[0]
        else:
            return HttpResponse({"msg": "要修改的数据不存在"}, status=404)
        # 2. 获取前端传入的要更新的请求体数据,并转化为字符串
        json_str = request.body.decode("utf8")
        # 3. 将请求体数据转换为字典
        book_dict = json.loads(json_str)
        # 4. 更新: 重新给实例对象指定的属性赋值
        book.btitle = book_dict["btitle"]
        book.bcontent = book_dict["bcontent"]
        book.save()
        # 5. 把更新完后的实例对象转换为字典
        book_dict = {
            "id": book.id,
            "btitle": book.btitle,
            "bcontent": book.bcontent,
            "bread": book.bread,
            "bprice": book.bprice,
            "bpub_date": book.bpub_date,
            "image": book.image.url if book.image else "",  # None.url会报错,所以用个if
        }
        # 6. 返回响应
        return JsonResponse(book_dict)

    def delete(self, request, pk):
        """删除一本图书"""
        # 获取要删除的模型类对象
        try:
            book = BookInfo.objects.get(id=pk)
        except BookInfo.DoesNotExist:
            return HttpResponse({"msg": "查询的数据不存在"}, status=404)
        # 删除模型类对象
        book.delete()
        # 删除不需要返回响应体,但是需要指定状态码
        return HttpResponse(status=204)

3. urls.py代码

from django.urls import path, re_path
from . import views
from django.views.decorators.csrf import csrf_exempt

urlpatterns = [
    re_path("^books/$", csrf_exempt(views.BookListView.as_view()), name="booklist"),
    re_path("^books/(?P<pk>\d+)/$", csrf_exempt(views.BookDetailView.as_view()), name="bookdetail"),
]

猜你喜欢

转载自blog.csdn.net/weixin_42289273/article/details/113978468