books/MixinView.py
from rest_framework.mixins import ListModelMixin, CreateModelMixin, RetrieveModelMixin, DestroyModelMixin, \
UpdateModelMixin
from rest_framework.generics import GenericAPIView, ListCreateAPIView, RetrieveUpdateDestroyAPIView
from .serializers import AuthorModelSerializer
from .models import Author
from rest_framework.response import Response
class AuthorMixinView(GenericAPIView, ListModelMixin, CreateModelMixin):
queryset = Author.objects
serializer_class = AuthorModelSerializer
def get(self, request):
return self.list(request)
def post(self, request):
return self.create(request)
class AuthorMixinView2(ListCreateAPIView):
queryset = Author.objects
serializer_class = AuthorModelSerializer
class AuthorDetailMixinView(GenericAPIView, RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin):
queryset = Author.objects
serializer_class = AuthorModelSerializer
def get(self, request, pk):
return self.retrieve(request, pk)
def put(self, request, pk):
return self.update(request, pk)
def delete(self, request, pk):
return self.destroy(request, pk)
class AuthorDetailMixinView2(RetrieveUpdateDestroyAPIView):
queryset = Author.objects
serializer_class = AuthorModelSerializer
books/urls.py
from django.urls import path, re_path
from rest_framework.routers import DefaultRouter
from .GenericAPIView import AuthorGenericAPIView, AuthorDetailGenericAPIView
from .MixinView import AuthorMixinView,AuthorDetailMixinView,AuthorMixinView2,AuthorDetailMixinView2
from .views import BookModelViewSet, AuthorViewSet
from .views import AuthorView, AuthorDetailView
router = DefaultRouter()
urlpatterns = [
# path('author/', AuthorView.as_view()),
# path('author/', AuthorGenericAPIView.as_view()),
# path('author/', AuthorMixinView.as_view()),
path('author/', AuthorMixinView2.as_view()),
# re_path('author/(\d+)', AuthorDetailView.as_view())
# re_path('author/(?P<pk>\d+)', AuthorDetailGenericAPIView.as_view())
# re_path('author/(?P<pk>\d+)', AuthorDetailMixinView.as_view())
re_path('author/(?P<pk>\d+)', AuthorDetailMixinView2.as_view())
]
router.register("book_model", BookModelViewSet)
router.register("author_model", AuthorViewSet)
urlpatterns += router.urls
books/serializers.py
from rest_framework import serializers
from .models import Book, Author
class BookModelSerializer(serializers.ModelSerializer):
class Meta:
model = Book
fields = "__all__"
class AuthorModelSerializer(serializers.ModelSerializer):
class Meta:
model = Author
fields = "__all__"
class AuthorSerializer(serializers.Serializer):
name = serializers.CharField(max_length=50)
age = serializers.IntegerField()
author_email = serializers.EmailField()
def update(self, instance, validated_data):
Author.objects.filter(pk=instance.pk).update(**validated_data)
return instance
def create(self, validated_data):
author = Author.objects.create(**validated_data)
return author
books/models.py
from django.db import models
# Create your models here.
class Book(models.Model):
title = models.CharField(max_length=50, verbose_name="书籍名称")
price = models.IntegerField(verbose_name="书籍价格")
pub_date = models.DateField(verbose_name="出版日期")
reading_quantity = models.IntegerField(verbose_name="阅读量")
comments = models.IntegerField(verbose_name="评论量")
publish = models.ForeignKey("Publish", on_delete=models.CASCADE, verbose_name="出版社名称")
authors = models.ManyToManyField("Author", verbose_name="作者")
def __str__(self):
return self.title
class Publish(models.Model):
name = models.CharField(max_length=50, verbose_name="出版社名称")
pub_email = models.EmailField(verbose_name="出版社邮箱")
def __str__(self):
return self.name
class Author(models.Model):
name = models.CharField(max_length=50, verbose_name="作者名称")
age = models.IntegerField(verbose_name="作者年龄")
author_email = models.EmailField(verbose_name="作者邮箱")
def __str__(self):
return self.name