以资源为url,通过不同的请求方式实现不同的行为。
以资源名作为url
POST:增 …/student/
GET:查所有 …/student/
GET:查单个 …/student/
DELETE:删 …/student/
PUT:改全部 …/student/
PATCH:改部分 …/student/
数据从前端传到服务器时,需要反序列化成能存入数据库的数据,同样,数据从数据库取出,需要序列化成可以传给前端的Json数据,drf里的序列化器可以很好地实现序列化与反序列化两个步骤。
设置字段,然后可以设置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
# ModelSerializer 模型序列化器,只需要配置
class BookSerializers(serializers.ModelSerializer):
date = serializers.DateField(source='pub_date')
class Meta:
model = Book
#fields = '__all__'
exclude = ["pub_date"]
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()
好像没有什么区别,就是把请求和序列化器在类里声明了,然后使用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()
查询全体和查询单人需要写两个视图函数
class PublishView(ListCreateAPIView):
queryset = Publish.objects.all()
serializer_class = PublishSerializers
class PublishDetailView(RetrieveUpdateDestroyAPIView):
queryset = Publish.objects.all()
serializer_class = PublishSerializers
一行解决
class AuthorView(ModelViewSet):
queryset = Author.objects.all()
serializer_class = AuthorSerializers