urls.py
"""
URL configuration for drf project.
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/4.2/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 book import views
urlpatterns = [
path('admin/', admin.site.urls),
path('book/', views.BookView.as_view()),
path('book/<int:pk>', views.BookDetailView.as_view()),
]
视图views.py
from rest_framework import serializers
from rest_framework.response import Response
from rest_framework.views import APIView
from book.models import Book
class BookSerializer(serializers.ModelSerializer):
# 如果有部分自定义的字段,只需要照常定义,并exclude排除原来的字段即可
asbgjasg_price = serializers.IntegerField(source='price')
class Meta:
# 指定类名
model = Book
# fields为白名单模式,指的是需要序列化的字段,__all__表示全部字段
# 包括pk(自动生成的自增主键),但是这里的值中指的是数据库中的字段名称
# 尽管模型上自动生成的主键的属性为pk,但是存入数据库中的名称是id。
# 因此不想要pk的值,就排除id即可
# 白名单模式一般直接使用all
# fields = '__all__'
exclude = ['id', 'price']
# 查询全部以及添加单个
class BookView(APIView):
def get(self, request):
booklist = Book.objects.all()
print('booklist', booklist)
serializer = BookSerializer(booklist, many=True)
return Response(serializer.data)
def post(self, request):
print(request.data)
serializer = BookSerializer(data=request.data)
is_valid = serializer.is_valid()
print('is_valid', is_valid)
# 存放错误信息(需要先访问is_valid方法)
print(serializer.errors)
if not is_valid:
return Response(serializer.errors)
# 下面处理通过的逻辑
serializer.save()
return Response({'msg': '添加成功', 'status': True})
class BookDetailView(APIView):
def get(self, request, pk):
print('参数方法调用')
book = Book.objects.get(pk=pk)
serializer = BookSerializer(book)
return Response(serializer.data)
def put(self, request, pk):
book = Book.objects.get(pk=pk)
print(request.data)
# 需要同时获取模型实例和数据
serializer = BookSerializer(book, data=request.data)
if serializer.is_valid():
serializer.save()
print('data: ', serializer.data)
return Response({'msg': '修改成功', 'status': True})
else:
return Response(serializer.errors)
def delete(self, request, pk):
# 不涉及序列化器
book = Book.objects.get(pk=pk)
book.delete()
return Response({'msg': '删除成功', 'status': True})