django DRF增删改查查

使用Django的DRF框架,基于restful接口规范的增删改查(查所有)查(查一个)操作:
/book/  GET 查看所有资源,返回所有资源;
/book/  POST 添加资源,返回添加的资源;
/book/1 GET 查看某一个资源,返回这一个资源;
/book/1 PUT 编辑某一个资源,返回编辑之后的这个资源;
/book/1 DELETE 删除某一个资源,返回空;

urls.py

urlpatterns = [
    path('sers/book/', views.BookView.as_view()),
    re_path('sers/book/(\d+)', views.BookDetailView.as_view()),
]

models.py

class Book(models.Model):
    title = models.CharField(verbose_name="书籍名称",max_length=32)
    price = models.IntegerField(verbose_name="价格",null=True)  #如果不设置null,数据库默认是不能为空的;
    pub_data = models.DateField(verbose_name="出版时间")

views.py

# 针对模型设计序列化器
class BookSerializers(serializers.Serializer):
    title = serializers.CharField(max_length=32)
    price = serializers.IntegerField(required=False)
    pub_data = serializers.DateField()
    # 字段名要和models中的名字一致,不然会报错,如果需要自定义需要通过如下方法:
    # data = serializers.DateTimeField(source="pub_data")

    # seve方法重写
    def create(self, validated_data):
        # 添加数据逻辑
        new_book = Book.objects.create(**self.validated_data)
        return new_book

    def update(self, instance, validated_data):
        # 更新逻辑
        Book.objects.filter(pk=instance.pk).update(**validated_data)
        # 针对更新加的两句话,区分instance
        updated_book = Book.objects.get(pk=instance.pk)
        return updated_book


class BookView(APIView):
    def get(self,request):
        '''查看所有书籍'''
        book_list = models.Book.objects.all()

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

    def post(self,request):
        '''添加书籍'''
        # 获取请求数据
        data = request.data

        # 构建序列化器对象
        serializer = BookSerializers(data=request.data)
        # 校验数据:返回布尔值,serializer.validated_data ,在这里校验,如果不通过,保存到这里serializer.errors
        if serializer.is_valid():
            # 数据校验通过,将数据插入到数据库中
            # new_book= Book.objects.create(**serializer.validated_data)
            serializer.save()
            return Response(serializer.data)
        else:
            # 校验失败
            return Response(serializer.errors)

class BookDetailView(APIView):
    def get(self,request,id):
        '''查某一个'''
        book = Book.objects.get(pk=id)  #模型类对象和queryset对象
        serializer = BookSerializers(instance=book,many=False)
        return Response(serializer.data)

    def put(self,request,id):
        '''编辑某一个数据,更新数据'''
        # 找到需要编辑的对象
        up_book = Book.objects.get(pk=id)
        # 构建序列化对象,这里instance和data这两个参数都要有;
        serializer = BookSerializers(instance=up_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()

针对views.py中的模型序列化器,还有以下更简便的写法,这个里面的create和update方法都自动被写好了,不用自己定义,自己只设置字段就可以了。

class BookSerializers(serializers.ModelSerializer):
    class Meta:
        model = Book
        fields = "__all__"
        # fields = ["title", "price"]
        # exclude = ["pub_date"]

 

你可能感兴趣的:(Django,django,sqlite,python)