Django REST framework views小记

1. models

from django.db import models

class Book(models.Model):
    title = models.CharField(max_length=32)
    price = models.IntegerField()
    pub_date = models.DateField()
    publish = models.ForeignKey("Publish")
    authors = models.ManyToManyField("Author")
    def __str__(self):
        return self.title

class Publish(models.Model):
    name = models.CharField(max_length=32)
    email = models.EmailField()
    def __str__(self):
        return self.name

class Author(models.Model):
    name = models.CharField(max_length=32)
    age = models.IntegerField()

    def __str__(self):
        return self.name

2. 在app下新建serializers.py并编辑

from app01.models import *

from rest_framework import serializers
from rest_framework.serializers import Serializer

class PublishModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = Publish
        fields = '__all__'

class AuthorModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = Author
        fields = '__all__'

class BookModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = Book
        fields = '__all__'

3. views & urls(层层递进)

3.1 views & urls --1–APIView

# views.py
from app01.models import *
from app01.serializer import PublishModelSerializer, BookModelSerializer
from rest_framework.views import APIView
from rest_framework.response import Response
############################################
## 基于APIView

# 处理多条数据(查,增)
class PublisherView(APIView):
    # 查看多条数据
    def get(self, request):
        publishers_list = Publish.objects.all()
        publishers_list_serializer = PublishModelSerializer(publishers_list, many=True)
        return Response(publishers_list_serializer.data)
    # 添加数据
    def post(self, request):
        post_data = PublishModelSerializer(data=request.data)
        if post_data.is_valid():
            post_data.save()
            return Response(post_data.data)
        return Response(post_data.errors)


# 处理单条数据(查,改,删)
class PublisherDetailView(APIView):
    # 获取单条数据 get 请求
    def get(self, request, pk):
        publisher = Publish.objects.get(pk=pk)
        publisher_serializer = PublishModelSerializer(publisher)
        return Response(publisher_serializer.data)

    # 修改单条数据 put 请求
    def put(self, request, pk):
        # 获取数据
        publisher = Publish.objects.get(pk=pk)
        # 用新数据序列化原数据
        publisher_ser = PublishModelSerializer(publisher, data=request.data)
        # 如果数据合法,则保存数据
        if publisher_ser.is_valid():
            publisher_ser.save()
            # 返回新数据
            return Response(publisher_ser.data)
        return Response(publisher_ser.errors)

    def delete(self, request, pk):
        Publish.objects.get(pk=pk).delete()
        return Response()

# urls.py
urlpatterns = [
    url(r'^publishers/$', views.PublisherView.as_view()),
    url(r'^publishers/(?P<pk>\d+)/$', views.PublisherDetailView.as_view()),
]

3.2 views & urls --2-- mixins 类

# views.py
from app01.models import *
from app01.serializer import PublishModelSerializer, BookModelSerializer
from rest_framework import generics
from rest_framework import mixins

############################################
## 基于 mixins 类

# 多条数据
class PublisherView(mixins.ListModelMixin, mixins.CreateModelMixin, generics.GenericAPIView):
    queryset = Publish.objects.all()
    serializer_class = PublishModelSerializer

    def get(self, request, *args, **kwargs):
        return self.list(request, *args, **kwargs)

    def post(self, request, *args, **kwargs):
        return self.create(request, *args, **kwargs)


class PublisherDetailView(mixins.RetrieveModelMixin, mixins.UpdateModelMixin, mixins.DestroyModelMixin,
                          generics.GenericAPIView):
    queryset = Publish.objects.all()
    serializer_class = PublishModelSerializer

    def get(self, request, *args, **kwargs):
        return self.retrieve(request, *args, **kwargs)

    def put(self, request, *args, **kwargs):
        return self.update(request, *args, **kwargs)

    def delete(self, request, *args, **kwargs):
        return self.destroy(request, *args, **kwargs)


# urls.py
urlpatterns = [
    url(r'^publishers/$', views.PublisherView.as_view()),
    url(r'^publishers/(?P<pk>\d+)/$', views.PublisherDetailView.as_view()),

3.3 views & urls --3-- 通用的类的视图

# views.py
from app01.models import *
from app01.serializer import PublishModelSerializer, BookModelSerializer
from rest_framework import generics

############################################
## 基于通用的类的视图

# 处理多条数据(查,增)
class PublisherView(generics.ListCreateAPIView):
    queryset = Publish.objects.all()
    serializer_class = PublishModelSerializer

# 处理单条数据(查,改,删)
class PublisherDetailView(generics.RetrieveUpdateDestroyAPIView):
    queryset = Publish.objects.all()
    serializer_class = PublishModelSerializer


# urls.py
urlpatterns = [
    url(r'^publishers/$', views.PublisherView.as_view()),
    url(r'^publishers/(?P<pk>\d+)/$', views.PublisherDetailView.as_view()),

3.4 views & urls --4-- viewsets.ModelViewSet

# views.py
from app01.models import *
from app01.serializer import PublishModelSerializer, BookModelSerializer
from rest_framework import viewsets

############################################
## 基于 viewsets.ModelViewSet

# 多条数据和单挑数据的处理合二为一
class PublisherView(viewsets.ModelViewSet):
    queryset = Publish.objects.all()
    serializer_class = PublishModelSerializer

class BookView(viewsets.ModelViewSet):
    queryset = Book.objects.all()
    serializer_class = BookModelSerializer


# urls.py
urlpatterns = [
    url(r'^publishers/$', views.PublisherView.as_view({'get': 'list', 'post': 'create'})),
    url(r'^publishers/(?P<pk>\d+)/$', views.PublisherView.as_view({
        'get': 'retrieve',
        'put': 'update',
        'patch': 'partial_update',
        'delete': 'destroy'
    })),
]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值