1.一个表可不可以有多个自增字段
2.用APIView,GenericAPIView,ModelViewSet重写Book的接口
1.一个表可不可以有多个自增字段
class Test(models.Model):
id = models.AutoField(primary_key=True)
index = models.AutoField()
name = models.CharField(max_length=12)
"""
assert not cls._meta.auto_field, "Model %s can't have more than one AutoField." % cls._meta.label
AssertionError: Model api.Test can't have more than one AutoField.
"""
2.用APIView,GenericAPIView,ModelViewSet重写Book的接口
(1)APIView重写Book接口
class BookAPIView(APIView):
def get(self, request, *args, **kwargs):
# 查询,单个查询和多个查询
pk = kwargs.get('pk', None)
if pk:
book_obj = models.Book.objects.filter(pk=pk).first()
if book_obj:
book_ser = BookSerializer(instance=book_obj)
return APIResponse(msg='成功获取数据', data=book_ser.data)
else:
return APIResponse(code='101', msg='获取数据失败', data={'result': '无效的主键值'})
else:
book_queryset = models.Book.objects.all()
book_ser = BookSerializer(instance=book_queryset, many=True)
return APIResponse(msg='成功获取数据', data=book_ser.data)
def post(self, request, *args, **kwargs):
"""
传过来的是一个字典,增加一条
传过来的是一个列表套字典,增加多条数据
"""
book_ser = None
if isinstance(request.data, dict):
book_ser = BookSerializer(data=request.data)
elif isinstance(request.data, list):
book_ser = BookSerializer(data=request.data, many=True)
book_ser.is_valid(raise_exception=True)
book_ser.save()
return APIResponse(msg='成功增加数据', data=book_ser.data)
def put(self, request, *args, **kwargs):
if kwargs.get('pk', None):
book_obj = models.Book.objects.filter(pk=kwargs.get('pk')).first()
if book_obj:
book_ser = BookSerializer(instance=book_obj, data=request.data)
book_ser.is_valid(raise_exception=True)
book_ser.save()
return APIResponse(msg='成功更新数据', data=book_ser.data)
else:
return APIResponse(msg='更新数据失败', data={'result': '无效的主键值'})
else:
book_list = []
modify_data = []
for item in request.data:
pk = item.pop('id')
book_list.append(models.Book.objects.get(pk=pk))
modify_data.append(item)
book_ser = BookSerializer(instance=book_list, data=modify_data, many=True)
book_ser.is_valid(raise_exception=True)
book_ser.save()
return APIResponse(msg='成功更新数据', data=book_ser.data)
def delete(self, request, *args, **kwargs):
pk = kwargs.get('pk', None)
pks = [pk, ] if pk else request.data.get('pks')
ret = models.Book.objects.filter(pk__in=pks, is_delete=False).update(is_delete=True)
ret_dict = {'msg': '删除数据成功'} if ret else {'code': '101', 'msg': '删除数据失败'}
return APIResponse(**ret_dict)
BookSerializer&BookListSerializer
class BookListSerializer(serializers.ListSerializer):
"""
ListSerializer里面有create方法,没有update方法,需要你重写
"""
def update(self, instance, validated_data):
return [
self.child.update(instance[i], attr) for i, attr in enumerate(validated_data)
]
class BookSerializer(serializers.ModelSerializer):
# 在models中写方法
class Meta:
list_serializer_class = BookListSerializer
model = Book
fields = ('id','name', 'price', 'publish', 'authors', 'publish_name', 'author_list')
extra_kwargs = {
'publish': {'write_only': True},
'publish_name': {'read_only': True},
'authors': {'write_only': True},
'author_list': {'read_only': True}
}
(2)用GenericAPIView写Book接口
class Book4view(GenericAPIView):
queryset = models.Book.objects.all()
serializer_class = BookSerializer
pk = None
def get_object(self):
queryset = self.filter_queryset(self.get_queryset())
filter_kwargs = {self.lookup_field: self.pk}
return queryset.filter(**filter_kwargs)
def get_queryset(self): # 重写get_queryset方法
queryset = self.queryset
if isinstance(queryset, QuerySet):
queryset = queryset.all()
return queryset.filter(is_delete=False)
def get(self, request, *args, **kwargs):
# 查询单个和查询多个
self.pk = kwargs.get('pk', None)
if self.pk:
book = self.get_object().first()
if book:
book_ser = self.get_serializer(book)
return APIResponse(msg='成功获取数据', data=book_ser.data)
else:
return APIResponse(msg='获取数据失败', data={'result': '无效的主键值'})
else:
book_queryset = self.get_queryset()
book_ser = self.get_serializer(book_queryset, many=True)
return APIResponse(msg='成功获取数据', data=book_ser.data)
def post(self, request, *args, **kwargs):
# 单增和群增
book_ser = None
if isinstance(request.data, dict):
book_ser = self.get_serializer(data=request.data)
elif isinstance(request.data, list):
book_ser = self.get_serializer(data=request.data, many=True)
if book_ser:
book_ser.is_valid(raise_exception=True)
book_ser.save()
return APIResponse(msg='成功增加数据', data=book_ser.data)
else:
return APIResponse(code='106', msg='未知错误')
def put(self, request, *args, **kwargs):
# 单修改和群修改
self.pk = kwargs.get('pk', None)
book_ser = None
if self.pk:
instance = self.get_object().first()
book_ser = self.get_serializer(instance=instance, data=request.data)
else:
book_list = []
modify_data = []
for item in request.data:
self.pk = item.pop('id')
book_list.append(self.get_object().first())
modify_data.append(item)
book_ser = self.get_serializer(instance=book_list, data=modify_data, many=True)
book_ser.is_valid(raise_exception=True)
book_ser.save()
return APIResponse(msg='修改数据成功', data=book_ser.data)
def delete(self, request, *args, **kwargs):
"""
单个删除和多个删除
"""
self.pk = kwargs.get('pk', None)
if self.pk:
if self.get_object():
self.get_object().update(is_delete=True)
return APIResponse(msg='删除数据成功')
else:
return APIResponse(code='102', msg='删除数据失败', data={'result': '无效的主键值'})
else:
pks = request.data.get('pks')
record = 0
for pk in pks:
self.pk = pk
if self.get_object():
self.get_object().update(is_delete=True)
record += 1
if record:
return APIResponse(msg='删除数据成功', data={'result': f'一共删除{record}条数据'})
else:
return APIResponse(code='102', msg='删除数据失败', data={'result': '无效的主键值'})
(3)用ModelViewSet写Book的接口
class Book5view(ModelViewSet):
queryset = models.Book.objects.all()
serializer_class = BookSerializer
pk = None
def get_object(self):
queryset = self.filter_queryset(self.get_queryset())
filter_kwargs = {self.lookup_field: self.pk}
return queryset.filter(**filter_kwargs)
def get_queryset(self):
queryset = self.queryset
if isinstance(queryset, QuerySet):
queryset = queryset.all()
return queryset.filter(is_delete=False)
def retrieve(self, request, *args, **kwargs):
instance = self.get_object().first()
if instance:
book_ser = self.get_serializer(instance)
return APIResponse(msg='成功获取数据', data=book_ser.data)
else:
return APIResponse(code='102', msg='获取数据失败', data={'result': '无效的主键值'})
def list(self, request, *args, **kwargs):
queryset = self.filter_queryset(self.get_queryset())
page = self.paginate_queryset(queryset)
if page is not None:
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = self.get_serializer(queryset, many=True)
print(222)
return APIResponse(msg='获取数据成功', data=serializer.data)
def create(self, request, *args, **kwargs):
assert isinstance(request.data, dict) or isinstance(request.data, list), (
'The type of `request.data` must be `dict` or `list`'
)
if isinstance(request.data, dict):
serializer = self.get_serializer(data=request.data)
else:
serializer = self.get_serializer(data=request.data, many=True)
serializer.is_valid(raise_exception=True)
self.perform_create(serializer)
return APIResponse(msg='创建数据成功', data=serializer.data)
def obtain(self, request, *args, **kwargs):
"""单查还是多查"""
self.pk = kwargs.get('pk', None)
print(self.pk)
if self.pk:
response = self.retrieve(request, *args, **kwargs)
else:
response = self.list(request, *args, **kwargs)
return response
def add(self, request, *args, **kwargs):
return self.create(request, *args, **kwargs)
def update(self, request, *args, **kwargs):
assert isinstance(request.data, dict) or isinstance(request.data, list), (
'The type of `request.data` must be `dict` or `list`'
)
if isinstance(request.data, dict):
self.pk = kwargs.get('pk', None)
if not self.pk:
return APIResponse(code='104', msg='数据更新失败', data={'result': '缺少主键参数'})
if not self.get_object():
return APIResponse(code='103', msg='数据更新失败', data={'result': '无效的主键字段'})
serializer = self.get_serializer(self.get_object().first(), data=request.data)
else:
book_list = []
modify_data = []
for item in request.data:
self.pk = item.pop('id')
book_list.append(self.get_object().first())
modify_data.append(item)
serializer = self.get_serializer(instance=book_list, data=modify_data, many=True)
serializer.is_valid(raise_exception=True)
self.perform_update(serializer)
return APIResponse(msg='数据更新成功', data=serializer.data)
def delete(self, request, *args, **kwargs):
self.pk = kwargs.get('pk', None)
pks = request.data.get('pks')
if not self.pk and not pks:
return APIResponse(code='103', msg='删除数据失败', data={'result': '缺少主键值'})
elif self.pk:
if self.get_object():
self.get_object().update(is_delete=True)
return APIResponse(msg='删除数据成功')
else:
return APIResponse(code='102', msg='删除数据失败', data={'result': '无效的主键值'})
elif pks:
ret = 0
for pk in pks:
self.pk = pk
if self.get_object():
self.get_object().update(is_delete=True)
ret += 1
if ret:
return APIResponse(msg='删除数据成功', data={'result': f'一共删除{ret}条数据'})
else:
return APIResponse(code='102', msg='删除数据失败', data={'result': '无效的主键值'})