Django开发之ORM批量操作

版本

1 Python 3.8.2
2 Django 3.0.6

批量入库

场景: 前端页面通过 textarea 文本框提交一列多行数据到Django后台,后台通过ORM做入库操作

表名: TableName 字段名: table_column, status, job 等

需要两个“媒介”: 1. 一个列表(用作批量入库的“收纳盒”) 2. 一个方法 bulk_create(批量入库的“武器”)

 1 ...省略...
 2 
 3 if request.method == 'POST':
 4     datas = request.POST.get('datas')
 5     if datas:
 6         data_to_insert = []
 7         for s in datas.split('\n'):
 8             data_to_insert.append(TableName(table_column=s, status='ok', job='teacher'))
 9             print('start insert...')
10             TableName.objects.bulk_create(data_to_insert)
11 
12 ...省略...

批量更新

疑问:这是批量更新吗?!

场景:前端提交数据后,Django后台通过ORM实现批量更新

...省略...

if request.method == 'POST':
    update_data = request.POST.get('update_data')
    for i in json.loads(update_data):
        TableName.objects.filter(id=i['0']).update(status=i['1'], job=i['2'], comments=i['3']) 
...省略...

说明:

request.POST.get('update_data') 中的 update_data 为前端Ajax提交过来的data
批量更新必须使用一个字段作为 filter,然后再去更新。相当于SQL语句中的where
转换为SQL语句: UPDATE TableName SET status = 'x', job = 'y', comments = 'z' WHERE id = 'xx'

 

聚合分组

场景: 统计每个类型的数量并统计出TOP 5

1 ORM
2 TableName.objects.values('job').annotate(jo=Count('job')).order_by('-jo')
3 
4 MySQL
5 SELECT job, COUNT(*) as num FROM app1_tablename GROUP BY job ORDER BY num desc

 

未完待续...

 

posted @ 2020-06-04 11:49  不吃浅水鱼  阅读(397)  评论(0)    收藏  举报