学习笔记
代码结构
创建项目
# 创建项目
django-admin startproject Devops
# 进入目录
cd Devops
# 创建app
python manage.py startapp CBV
pip install mysqlclient
# 迁移数据库
python manage.py makemigrations
# 生成数据表
python manage.py migrate
# 运行服务
python manage.py runserver
1 urls.py
from django.contrib import admin
from django.urls import path, re_path, include
from CBV import views
from rest_framework import routers
router = routers.DefaultRouter()
router.register('devops/publish',views.PublishView, basename='publish')
router.register('devops/author',views.AuthorView, basename='author')
urlpatterns = [
path('admin/', admin.site.urls),
path('devops/book/', views.BookView.as_view()),
re_path('devops/book/(\d+)', views.BookDetailView.as_view()),
re_path('^', include(router.urls)) # 两种注册路由的方式
# path('sers/publish/', views.PublishView.as_view()),
# re_path('sers/publish/(?P<pk>\d+)', views.PublishDetailView.as_view()),
# path('sers/author/', views.AuthorView.as_view()),
# re_path('sers/author/(?P<pk>\d+)', views.AuthorDetailView.as_view()),
# ------------------------------------------------------ #
# path('sers/publish/', views.PublishView.as_view(
# {"get": 'list', 'post': 'create'}
# )
# ),
# re_path('sers/publish/(?P<pk>\d+)', views.PublishView.as_view(
# {"get": 'retrieve', 'delete': 'destroy', 'put': 'update'}
# )
# ),
#
#
# path('sers/author/', views.AuthorView.as_view(
# {"get": 'list', 'post': 'create'}
# )
# ),
# re_path('sers/author/(?P<pk>\d+)', views.AuthorView.as_view(
# {"get": 'retrieve', 'delete': 'destroy', 'put': 'update'}
# )
# ),
]
# 两种注册路由的方式
# urlpatterns += router.urls
2 settings.py
ALLOWED_HOSTS = ['*']
# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework',
'CBV.apps.CbvConfig',
]
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'test', # 数据库名称
'USER': 'root', # 数据库用户名
'PASSWORD': '123456', # 数据库密码
'HOST': '192.168.213.135',
'PORT': '3306',
}
}
3 models.py
from django.db import models
class DevopsCBV(models.Model):
title = models.CharField(max_length=32, verbose_name="书籍名称")
price = models.IntegerField(verbose_name="价格")
pub_date = models.DateField(verbose_name="出版日期")
class Meta:
db_table = 'devops_cbv'
class Publish(models.Model):
name = models.CharField(max_length=32, verbose_name="出版社名称")
address = models.CharField(max_length=32, verbose_name="出版社地址")
class Meta:
db_table = 'publish'
class Author(models.Model):
name = models.CharField(max_length=32, verbose_name="作者")
age = models.IntegerField(verbose_name="年龄")
class Meta:
db_table = 'author'
4 views.py
from django.shortcuts import render, HttpResponse
from rest_framework.views import APIView
from CBV.models import DevopsCBV, Publish, Author
from rest_framework import serializers
from rest_framework.response import Response
# 基于APIView的接口实现
class BookSerializers(serializers.Serializer):
title = serializers.CharField(max_length=32)
price = serializers.IntegerField()
date = serializers.DateField(source="pub_date")
def create(self, validated_data):
print(validated_data)
new_book = DevopsCBV.objects.create(**self.validated_data)
return new_book
def update(self, instance, validated_data):
# 更新逻辑
DevopsCBV.objects.filter(pk=instance.pk).update(**validated_data)
updated_book = DevopsCBV.objects.get(pk=instance.pk)
return updated_book
class BookSerializers(serializers.ModelSerializer):
date = serializers.DateField(source='pub_date')
class Meta:
model = DevopsCBV
# fields = '__all__'
exclude = ['pub_date']
class BookView(APIView):
def get(self, request):
# DevopsCBV.objects.create(title='西游记', price=299, pub_date='2021-02-11')
# DevopsCBV.objects.create(title='水浒传', price=299, pub_date='2022-07-11')
book_list = DevopsCBV.objects.all()
# 构建序列化器对象 instance: 用于序列化传参
# 序列化多个实例化对象 many为True ,实例化对象单个时为False
serializer = BookSerializers(instance=book_list, many=True)
print(serializer.data)
# [OrderedDict([('title', '西游记'), ('price', 299), ('date', '2021-02-11')]),
# OrderedDict([('title', '水浒传'), ('price', 299), ('date', '2022-07-11')])]
return Response(serializer.data)
# 返回值为OrderedDict 有序字典
# return HttpResponse(serializer.data)
def post(self, request):
print(request.data)
serializer = BookSerializers(data=request.data)
if serializer.is_valid():
# print(serializer.validated_data)
serializer.save()
# new_book = Book.objects.create(**serializer.validated_data)
print(serializer.data)
return Response(serializer.data)
else:
# 如果有错误信息则保存在 serializer.errors 里
return Response(serializer.errors)
# return Response()
class BookDetailView(APIView):
def get(self, request, id):
book = DevopsCBV.objects.get(pk=id)
print(book)
# 序列化传参 instance ,反序列化传参 data
serializer = BookSerializers(instance=book, many=False)
print(serializer.data)
return Response(serializer.data)
def put(self, request, id):
print(request.data)
update_book = DevopsCBV.objects.get(pk=id)
serializer = BookSerializers(instance=update_book, data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
else:
return Response(serializer.errors)
def delete(self, request, id):
DevopsCBV.objects.get(pk=id).delete()
return Response()
# --------------------------- 基于GenericAPIView的接口实现
class PublishSerializers(serializers.ModelSerializer):
class Meta:
model = Publish
fields = '__all__'
# exclude = ['pub_date']
from rest_framework.generics import GenericAPIView
class PublishView(GenericAPIView):
queryset = Publish.objects.all()
serializer_class = PublishSerializers
def get(self, request):
# 获取所有书籍
# publish_list = self.get_queryset()
# serializer = PublishSerializers(instance=self.get_queryset(), many=True)
# self.get_serializer_class()(instance=self.get_queryset(), many=True)
serializer = self.get_serializer(instance=self.get_queryset(), many=True)
return Response(serializer.data)
def post(self, request):
# serializer = PublishSerializers(data=request.data)
# self.get_serializer_class()(data=request.data)
serializer = self.get_serializer(data=request.data)
if serializer.is_valid():
# print(serializer.validated_data)
serializer.save()
# new_book = Book.objects.create(**serializer.validated_data)
print(serializer.data)
return Response(serializer.data)
else:
# 如果有错误信息则保存在 serializer.errors 里
return Response(serializer.errors)
class PublishDetailView(GenericAPIView):
queryset = Publish.objects.all()
serializer_class = PublishSerializers
def get(self, request, pk):
serializer = self.get_serializer(instance=self.get_object(), many=False)
return Response(serializer.data)
def put(self, request, pk):
print(request.data)
# update_book = Book.objects.get(pk=id)
# serializer = PublishSerializers(instance=self.get_object(), data=request.data)
serializer = self.get_serializer(instance=self.get_object(), data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
else:
return Response(serializer.errors)
def delete(self, request, pk):
self.get_object().delete()
return Response()
# 基于mixinsAPIView的接口实现
class PublishSerializers(serializers.ModelSerializer):
class Meta:
model = Publish
fields = '__all__'
# exclude = ['pub_date']
from rest_framework.generics import GenericAPIView
from rest_framework.mixins import ListModelMixin, CreateModelMixin, UpdateModelMixin, DestroyModelMixin, RetrieveModelMixin
class PublishView(ListModelMixin, CreateModelMixin, UpdateModelMixin, DestroyModelMixin, GenericAPIView):
queryset = Publish.objects.all()
serializer_class = PublishSerializers
def get(self, request):
# 获取所有书籍
# publish_list = self.get_queryset()
# serializer = PublishSerializers(instance=self.get_queryset(), many=True)
# self.get_serializer_class()(instance=self.get_queryset(), many=True)
# serializer = self.get_serializer(instance=self.get_queryset(), many=True)
# return Response(serializer.data)
return self.list(request)
def post(self, request):
# serializer = PublishSerializers(data=request.data)
# self.get_serializer_class()(data=request.data)
# serializer = self.get_serializer(data=request.data)
# if serializer.is_valid():
# # print(serializer.validated_data)
# serializer.save()
# # new_book = Book.objects.create(**serializer.validated_data)
# print(serializer.data)
# return Response(serializer.data)
# else:
# # 如果有错误信息则保存在 serializer.errors 里
# return Response(serializer.errors)
return self.create(request)
class PublishDetailView(RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin, GenericAPIView):
queryset = Publish.objects.all()
serializer_class = PublishSerializers
def get(self, request, pk):
# serializer = self.get_serializer(instance=self.get_object(), many=False)
# return Response(serializer.data)
return self.retrieve(request, pk)
def put(self, request, pk):
# print(request.data)
# # update_book = Book.objects.get(pk=id)
#
# # serializer = PublishSerializers(instance=self.get_object(), data=request.data)
# serializer = self.get_serializer(instance=self.get_object(), data=request.data)
# if serializer.is_valid():
# serializer.save()
# return Response(serializer.data)
# else:
# return Response(serializer.errors)
return self.update(request, pk)
def delete(self, request, pk):
# self.get_object().delete()
# return Response()
return self.destroy(request, pk)
class AuthorSerializers(serializers.ModelSerializer):
class Meta:
model = Author
fields = '__all__'
# exclude = ['pub_date']
from rest_framework.generics import GenericAPIView
from rest_framework.mixins import ListModelMixin, CreateModelMixin, UpdateModelMixin, DestroyModelMixin, RetrieveModelMixin
class AuthorView(ListModelMixin, CreateModelMixin, UpdateModelMixin, DestroyModelMixin, GenericAPIView):
queryset = Author.objects.all()
serializer_class = AuthorSerializers
def get(self, request):
# 获取所有书籍
# publish_list = self.get_queryset()
# serializer = PublishSerializers(instance=self.get_queryset(), many=True)
# self.get_serializer_class()(instance=self.get_queryset(), many=True)
# serializer = self.get_serializer(instance=self.get_queryset(), many=True)
# return Response(serializer.data)
return self.list(request)
def post(self, request):
# serializer = PublishSerializers(data=request.data)
# self.get_serializer_class()(data=request.data)
# serializer = self.get_serializer(data=request.data)
# if serializer.is_valid():
# # print(serializer.validated_data)
# serializer.save()
# # new_book = Book.objects.create(**serializer.validated_data)
# print(serializer.data)
# return Response(serializer.data)
# else:
# # 如果有错误信息则保存在 serializer.errors 里
# return Response(serializer.errors)
return self.create(request)
class AuthorDetailView(RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin, GenericAPIView):
queryset = Author.objects.all()
serializer_class = AuthorSerializers
def get(self, request, pk):
# serializer = self.get_serializer(instance=self.get_object(), many=False)
# return Response(serializer.data)
return self.retrieve(request, pk)
def put(self, request, pk):
# print(request.data)
# # update_book = Book.objects.get(pk=id)
#
# # serializer = PublishSerializers(instance=self.get_object(), data=request.data)
# serializer = self.get_serializer(instance=self.get_object(), data=request.data)
# if serializer.is_valid():
# serializer.save()
# return Response(serializer.data)
# else:
# return Response(serializer.errors)
return self.update(request, pk)
def delete(self, request, pk):
# self.get_object().delete()
# return Response()
return self.destroy(request, pk)
# ------------------------------------ 基于ListCreateAPIView, RetrieveUpdateDestroyAPIView的接口实现 ------------------------------------
class PublishSerializers(serializers.ModelSerializer):
class Meta:
model = Publish
fields = '__all__'
# exclude = ['pub_date']
from rest_framework.generics import ListCreateAPIView, RetrieveUpdateDestroyAPIView
class PublishView(ListCreateAPIView):
queryset = Publish.objects.all()
serializer_class = PublishSerializers
class PublishDetailView(RetrieveUpdateDestroyAPIView):
queryset = Publish.objects.all()
serializer_class = PublishSerializers
# ------------------------------------ 基于viewset类:重新构建分发机制 ------------------------------------
from rest_framework.viewsets import ViewSet
class PublishSerializers(serializers.ModelSerializer):
class Meta:
model = Publish
fields = '__all__'
# exclude = ['pub_date']
class PublishView(ViewSet):
def get_all(self, request):
return Response('21')
def get_object(self, request, pk):
return Response('32')
# ------------------------------------ 基于Modelviewset类------------------------------------
from rest_framework.viewsets import ModelViewSet
class PublishSerializers(serializers.ModelSerializer):
class Meta:
model = Publish
fields = '__all__'
# exclude = ['pub_date']
class AuthorSerializers(serializers.ModelSerializer):
class Meta:
model = Author
fields = '__all__'
# exclude = ['pub_date']
class PublishView(ModelViewSet):
queryset = Publish.objects.all()
serializer_class = PublishSerializers
class AuthorView(ModelViewSet):
queryset = Author.objects.all()
serializer_class = AuthorSerializers