views
from rest_framework.response import Response
from api import models
from rest_framework.views import APIView
from rest_framework.generics import GenericAPIView
from api.ser import BookModelSerializer
class BookAPIView(APIView):
def get(self,request,*args,**kwargs):
#查询单个和查询所有,合到一起
# 查所有
book_list=models.Book.objects.all().filter(is_delete=False)
book_list_ser=BookModelSerializer(book_list,many=True)
return Response(data=book_list_ser.data)
#查一个
def post(self,request,*args,**kwargs):
# 具备增单条,和增多条的功能
if isinstance(request.data,dict):
book_ser=BookModelSerializer(data=request.data)
book_ser.is_valid(raise_exception=True)
book_ser.save()
return Response(data=book_ser.data)
elif isinstance(request.data,list):
#现在book_ser是ListSerializer对象
from rest_framework.serializers import ListSerializer
book_ser = BookModelSerializer(data=request.data,many=True) #增多条
print('--------',type(book_ser))
book_ser.is_valid(raise_exception=True)
book_ser.save()
# 新增---》ListSerializer--》create方法
# def create(self, validated_data):
# self.child是BookModelSerializer对象
# print(type(self.child))
# return [
# self.child.create(attrs) for attrs in validated_data
# ]
return Response(data=book_ser.data)
def put(self,request,*args,**kwargs):
# 改一个,改多个
#改一个个
if kwargs.get('pk',None):
book=models.Book.objects.filter(pk=kwargs.get('pk')).first()
book_ser = BookModelSerializer(instance=book,data=request.data,partial=True) # 增多条
book_ser.is_valid(raise_exception=True)
book_ser.save()
return Response(data=book_ser.data)
else:
#改多个,
# 前端传递数据格式[{id:1,name:xx,price:xx},{id:1,name:xx,price:xx}]
# 处理传入的数据 对象列表[book1,book2] 修改的数据列表[{name:xx,price:xx},{name:xx,price:xx}]
book_list=[]
modify_data=[]
for item in request.data:
#{id:1,name:xx,price:xx}
pk=item.pop('id')
book=models.Book.objects.get(pk=pk)
book_list.append(book)
modify_data.append(item)
# 第一种方案,for循环一个一个修改
#把这个实现
# for i,si_data in enumerate(modify_data):
# book_ser = BookModelSerializer(instance=book_list[i], data=si_data)
# book_ser.is_valid(raise_exception=True)
# book_ser.save()
# return Response(data='成功')
# 第二种方案,重写ListSerializer的update方法
book_ser = BookModelSerializer(instance=book_list,data=modify_data,many=True)
book_ser.is_valid(raise_exception=True)
book_ser.save() #ListSerializer的update方法,自己写的update方法
return Response(book_ser.data)
# request.data
#
# book_ser=BookModelSerializer(data=request.data)
def delete(self,request,*args,**kwargs):
#单个删除和批量删除
pk=kwargs.get('pk')
pks=[]
if pk:
# 单条删除
pks.append(pk)
#不管单条删除还是多条删除,都用多条删除
#多条删除
# {'pks':[1,2,3]}
else:
pks=request.data.get('pks')
#把is_delete设置成true
# ret返回受影响的行数
ret=models.Book.objects.filter(pk__in=pks,is_delete=False).update(is_delete=True)
if ret:
return Response(data={'msg':'删除成功'})
else:
return Response(data={'msg': '没有要删除的数据'})
serializers
from rest_framework import serializers
from api import models
#写一个类,继ListSerializer,重写update
class BookListSerializer(serializers.ListSerializer):
# def create(self, validated_data):
# print(validated_data)
# return super().create(validated_data)
def update(self, instance, validated_data):
print(instance)
print(validated_data)
# 保存数据
# self.child:是BookModelSerializer对象
# ll=[]
# for i,si_data in enumerate(validated_data):
# ret=self.child.update(instance[i],si_data)
# ll.append(ret)
# return ll
return [
# self.child.update(对象,字典) for attrs in validated_data
self.child.update(instance[i],attrs) for i,attrs in enumerate(validated_data)
]
#如果序列化的是数据库的表,尽量用ModelSerializer
class BookModelSerializer(serializers.ModelSerializer):
# 一种方案(只序列化可以,反序列化有问题)
# publish=serializers.CharField(source='publish.name')
# 第二种方案,models中写方法
class Meta:
list_serializer_class=BookListSerializer
model=models.Book
# fields='__all__'
# 用的少
# depth=0
fields = ('name','price','authors','publish','publish_name','author_list')
extra_kwargs={
'publish':{'write_only':True},
'publish_name':{'read_only':True},
'authors':{'write_only':True},
'author_list':{'read_only':True}
}