DRF的视图组件

对之前使用视图组件进行接口优化

  1.使用视图组件的mixin进行接口逻辑优

  导入mixin

from rest_framework.mixinx import (
    ListModelMix,
    CreateModelMixin,
    DestroyModelMixin,
    UpdateModelMixin,
    RetrieveModelMixin
)

  models.py

from django.db import models

# Create your models here.

class Author(models.Model):
    nid = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32)
    age = models.IntegerField()
    def __str__(self):
        return self.name

class Publish(models.Model):
    nid = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32)
    city = models.CharField(max_length=32)
    email = models.EmailField()

    def __str__(self):
        return self.name

class Book(models.Model):
    nid = models.AutoField(primary_key=True)
    title = models.CharField(max_length=32)
    price = models.DecimalField(max_digits=5,decimal_places=2)

    publish = models.ForeignKey(to="Publish",related_name="book",related_query_name="book_query",on_delete=models.CASCADE)
    authors = models.ManyToManyField(to="Author")

  urls.py

from django.contrib import admin
from django.urls import path,re_path
from app01 import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('books/', views.BookView.as_view()),
    re_path('books/(?P<pk>d+)', views.BookFilterView.as_view()),
    

]    

  view.py

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.mixins import (
    ListModelMixin, CreateModelMixin, DestroyModelMixin, UpdateModelMixin, RetrieveModelMixin
)

from app01.models import (
    Book,Publish,Author
)
from .app_serializers import BookSerializer


class BookView(ListModelMixin, CreateModelMixin, GenericAPIView):
    queryset = Book.objects.all()
    serializer_class = BookSerializer

    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 BookFilterView(RetrieveModelMixin, DestroyModelMixin, UpdateModelMixin, GenericAPIView):
    queryset = Book.objects.all()
    serializer_class = BookSerializer

    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)

  注意:单条数据操作的url是这样的:re_path(r'books/(?P<pk>d+)/$, views.BookFilterView.as_view())

还可以进行优化---使用视图组件的view进行接口逻辑优化

  导入模块

from rest_framework import generics

  可以把改 view.py

class BookView(generics.ListCreateAPIView)
     queryset = Book.objects.all()
     serializer_class = BookSerializer
                    
class BookFilterView(generics.RetrieveUpdateDestroyAPIView):
    queryset = Book.objects.all()
    serializer_class = BookSerializer    

最后改成------使用视图组件的viewset进行接口逻辑优化

  导入模块

from rest_framework.viewsets import ModelViewSet

  urls.py

from django.contrib import admin
from django.urls import path,re_path
from app01 import views

urlpatterns = [
    path('bookssss/', views.BooksssView.as_view({
        "get": "list",
        "post": "create",
    })),
    re_path('bookssss/(?P<pk>d+)', views.BooksssView.as_view({
        "get": "retrieve",
        "put": "update",
        "delete": "destroy"
    })),
]

  view.py

class BookView(ModelViewSet):
    queryset = Book.objects.all()
    serializer_class = BookSerializer1
原文地址:https://www.cnblogs.com/chenxi67/p/10085099.html