用APIview实现的功能

""" GET /books/ 提供所有记录 POST /books/ 新增一条记录 GET /books/<pk>/ 提供指定id的记录 PUT /books/<pk>/ 修改指定id的记录 DELETE /books/<pk>/ 删除指定id的记录 APIView 序列化器 """

路由

    # 列表视图的路由APIView
    url(r'^books/$', views.BookListAPIView.as_view()),
    # 详情视图的路由APIView
    url(r'^books/(?P<pk>\d+)/$', views.BookDetailAPIView.as_view()),

model

# 定义图书模型类BookInfo
class BookInfo(models.Model):
    btitle = models.CharField(max_length=20, verbose_name='名称')
    bpub_date = models.DateField(verbose_name='发布日期')
    bread = models.IntegerField(default=0, verbose_name='阅读量')
    bcomment = models.IntegerField(default=0, verbose_name='评论量')
    is_delete = models.BooleanField(default=False, verbose_name='逻辑删除')
    # 如果模型已经迁移建表,并且表中已经有数据了,那么后添加的新字段必须可以为空或给了默认值,不然迁移报错
    # upload_to 表示上传的图片文件存储到MEDIA_ROOT指定目录中的book
    image = models.ImageField(verbose_name='图书', null=True, upload_to='book')

    class Meta:
        db_table = 'tb_books'  # 指明数据库表名
        verbose_name = '图书'  # 在admin站点中显示的名称
        verbose_name_plural = verbose_name  # 显示的复数名称

    def __str__(self):
        """定义每个数据对象的显示信息"""
        return self.btitle

    def bpub_date_format(self):
        return self.bpub_date.strftime('%Y-%m-%d')
    bpub_date_format.short_description = '发布日期'  # 修改方法名在列表页展示的成中文
    bpub_date_format.admin_order_field = 'bpub_date'  # 此方法中的数据依据模型的那个字段进行排序


# 定义英雄模型类***fo
class ***fo(models.Model):
    GENDER_CHOICES = (
        (0, 'female'),
        (1, 'male')
    )
    hname = models.CharField(max_length=20, verbose_name='名称')
    hgender = models.SmallIntegerField(choices=GENDER_CHOICES, default=0, verbose_name='性别')
    hcomment = models.CharField(max_length=200, null=True, verbose_name='描述信息')
    hbook = models.ForeignKey(BookInfo, on_delete=models.CASCADE, verbose_name='图书')  # 外键
    is_delete = models.BooleanField(default=False, verbose_name='逻辑删除')

    class Meta:
        db_table = 'tb_heros'
        verbose_name = '英雄'
        verbose_name_plural = verbose_name



    def __str__(self):
        return self.hname

    def read(self):
        return self.hbook.bread

    read.short_description = '阅读量'
    read.admin_order_field = 'hbook__bread'

序列化文件

from django.contrib.auth.models import User
from rest_framework import serializers

from .models import BookInfo

class BookInfoModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = BookInfo
        fields = '__all__'  # []
        # exclude =
        # read_only_fields = []
        # extra_kwargs = {'bread': {'min_value': 0, }}


view视图

查询全部数据

"""以下是继承APIView的视图"""
class BookListAPIView(APIView):
    """列表视图"""
    def get(self, request):
        """查询所有"""
        qs = BookInfo.objects.all()
        # 展示数据用instance属性
        serializer = BookInfoModelSerializer(instance=qs, many=True)
        print(serializer.data)
        return Response(serializer.data)

新增数据

"""以下是继承APIView的视图"""
class BookListAPIView(APIView):

    def post(self, request):
        """新增"""
        # 获取前端传入的请求体数据
        data = request.data
        # 创建序列化器进行反序列化
        serializer = BookInfoModelSerializer(data=data)
        # 调用序列化器的is_valid方法进行校验
        serializer.is_valid(raise_exception=True)
        # 调用序列化器的save方法进行执行create方法
        serializer.save()
        # 响应
        return Response(serializer.data, status=status.HTTP_201_CREATED)

根据pk查询一条数据

class BookDetailAPIView(APIView):
    """详情视图"""

    def get(self, request, pk):
        # 查询pk指定的模型对象
        try:
            book = BookInfo.objects.get(id=pk)
        except BookInfo.DoesNotExist:
            return Response(status=status.HTTP_404_NOT_FOUND)
        # 创建序列化器进行序列化
        serializer = BookInfoModelSerializer(instance=book)
        # 响应
        return Response(serializer.data)

根据pk进行修改一条数据

class BookDetailAPIView(APIView):


    def put(self, request, pk):
        # 查询pk所指定的模型对象

        try:
            book = BookInfo.objects.get(id=pk)
        except BookInfo.DoesNotExist:
            return Response(status=status.HTTP_404_NOT_FOUND)
        # 获取前端传入的请求体数据
        # 创建序列化器进行反序列化
        serializer = BookInfoModelSerializer(instance=book, data=request.data)
        # 校验
        serializer.is_valid(raise_exception=True)
        # save--->update
        serializer.save()
        # 响应
        return Response(serializer.data)

删除一条数据

    def delete(self, request, pk):
        # 查询pk所指定的模型对象
        try:
            book = BookInfo.objects.get(id=pk)
        except BookInfo.DoesNotExist:
            return Response(status=status.HTTP_404_NOT_FOUND)

        book.delete()
        return Response(status=status.HTTP_204_NO_CONTENT)