RESTAPI简介与DRF使用

RESTAPI

以资源为url,通过不同的请求方式实现不同的行为。

以资源名作为url

POST:增 …/student/

GET:查所有 …/student/

GET:查单个 …/student// 获取id=pk的学生

DELETE:删 …/student//

PUT:改全部 …/student//

PATCH:改部分 …/student//

视图函数

数据从前端传到服务器时,需要反序列化成能存入数据库的数据,同样,数据从数据库取出,需要序列化成可以传给前端的Json数据,drf里的序列化器可以很好地实现序列化与反序列化两个步骤。

1. 序列化器

1. 自己写的序列化器:

设置字段,然后可以设置POST和UPDATE时数据库的操作

class BookSerializers(serializers.Serializer):
    title = serializers.CharField(max_length=32)
    price = serializers.IntegerField()
    pub_date = serializers.DateField()
    
    def create(self, validated_data):
        # 添加数据逻辑
        new_book = Book.objects.create(**validated_data)
        return new_book

    def update(self, instance, validated_data):
        Book.objects.filter(pk=instance.pk).update(**validated_data)
        updated_book = Book.objects.get(pk=instance.pk)
        return updated_book

2. 使用ModelSerializer,里面实现了create和update方法

# ModelSerializer 模型序列化器,只需要配置
class BookSerializers(serializers.ModelSerializer):
    date = serializers.DateField(source='pub_date')
    class Meta:
        model = Book
        #fields = '__all__'
        exclude = ["pub_date"]

2. 视图函数

1. 继承APIView,自己写get/post/get/put/delete方法

class BookView(APIView):

    def get(self, request):
        # 获取所有书籍
        book_list = Book.objects.all()

        # 构建序列化器对象
        serializer = BookSerializers(instance=book_list, many=True)
        return Response(serializer.data)

    def post(self, request):

        serializer = BookSerializers(data=request.data)

        if serializer.is_valid():
            # 通过
            # new_book = Book.objects.create(**serializer.validated_data)
            serializer.save()
            return Response(serializer.data)
        else:
            # 校验失败
            return Response(serializer.errors)
        return Response()


class BookDetailView(APIView):

    def get(self, request, id):

        book = Book.objects.get(pk=id)
        serializer = BookSerializers(instance=book, many=False)

        return Response(serializer.data)

    def put(self, request, id):
        update_book = Book.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):
        Book.objects.get(pk=id).delete()
        return Response()

2. 继承GenericAPIView

好像没有什么区别,就是把请求和序列化器在类里声明了,然后使用self.get_serializer来获得序列化器,用get_objetct来获取查询结果。

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):

        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()

3. 继承generic的ListCreateAPIView, RetrieveUpdateDestroyAPIView

查询全体和查询单人需要写两个视图函数

class PublishView(ListCreateAPIView):
    queryset = Publish.objects.all()
    serializer_class = PublishSerializers

class PublishDetailView(RetrieveUpdateDestroyAPIView):
    queryset = Publish.objects.all()
    serializer_class = PublishSerializers

4. 继承ModelViewSet

一行解决

class AuthorView(ModelViewSet):

    queryset = Author.objects.all()
    serializer_class = AuthorSerializers

你可能感兴趣的:(django,drf,restful)