DRF接口操作--群增,群更,群删

摘要:
1.一个表可以有多个自增字段吗?2.使用APIView、GenericAPIView和ModelViewSet重写Book界面。1.一个表可以有多个自增字段吗?classTest(models.Model):id=models。AutoField(primary_key=True)索引=模型。AutoField()名称=模型。字符字段(最大长度=12)

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': '无效的主键值'})

免责声明:文章转载自《DRF接口操作--群增,群更,群删》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇fatfs源码阅读Docker镜像拉取失败或超时的解决办法:添加国内镜像下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

primary库新增数据文件后,standby库无法创建文件并终止数据同步

主库是RAC环境,使用asm存放数据文件,备库是操作系统本地文件系统存放数据文件。在主库执行以下操作: SQL> alter tablespace ysdv add datafile '+data' size 1024m autoextend on next 100m maxsize 10240m; 备库的alert日志报以下错误: Mon Ju...

Axios源码阅读笔记#1 默认配置项

Promise based HTTP client for the browser and node.js 这是 Axios 的定义,Axios 是基于 Promise,用于HTTP客户端——浏览器和 node.js 的库 。Github:https://github.com/mzabriskie/axios。 官方文档中 Axios 的 feature...

mysql5.7基于gtid主从重做

master上备份mysql/data/Percona-5721/scripts/xtra_sohmysql_fullbak.shscp 备份文件到备机关闭slave service mysql stop在slave服务器恢复全备恢复:恢复注意恢复文件权限问题tar -izxvf xxxx.tar.gz 注意加-iinnobackupex --defaul...

[django]l利用xlrd实现xls文件导入数据

代码: #coding:utf-8 import os os.environ.setdefault("DJANGO_SETTINGS_MODULE", "www.settings") ''' Django 版本大于等于1.7的时候,需要加上下面两句 import django django.setup() 否则会抛出错误 dja...

axios统一封装

本文代码参考了网上别人的资料,经过修改而来 1 /** 2 * Created by zxf on 2017/9/6. 3 * 封装统一的ajax请求,统一拦截请求,对不同的请求状态封装 4 * 通常说, ajax 请求错误有两种, 一种是网络问题或者代码问题所造成的 400, 500错误等,需要checkStatus方法拦截 5 * 另外一种是请求参数后...

Data URI

我们常常会看到网页上有些图片或者css的background-image后跟了一堆的字符串,类似这样子: data:image/jpeg;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZG...wxMDIZz4NCjwvc3ZnPg== 这个就是Data URI scheme。 Data URI scheme是在RFC239...