使用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"]