Python Django REST framework 入门

在这里插入图片描述

学习笔记

代码结构

在这里插入图片描述

创建项目

# 创建项目
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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值