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"),
]