from django.http import JsonResponse from django.db.models import F from django.db import IntegrityError, transaction import traceback # 导入 Order 对象定义 from common.models import Order,OrderMedicine import json def dispatcher(request): # 根据session判断用户是否是登录的管理员用户 if 'usertype' not in request.session: return JsonResponse({ 'ret': 302, 'msg': '未登录', 'redirect': '/mgr/sign.html'}, status=302) if request.session['usertype'] != 'mgr': return JsonResponse({ 'ret': 302, 'msg': '用户非mgr类型', 'redirect': '/mgr/sign.html'}, status=302) # 将请求参数统一放入request 的 params 属性中,方便后续处理 # GET请求 参数 在 request 对象的 GET属性中 if request.method == 'GET': request.params = request.GET # POST/PUT/DELETE 请求 参数 从 request 对象的 body 属性中获取 elif request.method in ['POST','PUT','DELETE']: # 根据接口,POST/PUT/DELETE 请求的消息体都是 json格式 request.params = json.loads(request.body) # 根据不同的action分派给不同的函数进行处理 action = request.params['action'] if action == 'list_order': return listorder(request) elif action == 'add_order': return addorder(request) # 订单 暂 不支持修改 和删除 else: return JsonResponse({'ret': 1, 'msg': '不支持该类型http请求'}) def listorder(request): # 返回一个 QuerySet 对象 ,包含所有的表记录 # 每条表记录都是是一个dict对象, # key 是字段名,value 是 字段值 # qs = Order.objects.values('id', # 'name', # 'create_date', # 'customer__name', # 'medicines__name' # ) qs = Order.objects.annotate( customer_name = F('customer__name'), medicines_name= F('medicines__name') ).values('id', 'name', 'create_date', 'customer_name', 'medicines_name' ) retlist = list(qs) newlist = [] id2order = {} for one in retlist: orderid = one['id'] if orderid not in id2order: newlist.append(one) id2order[orderid] = one else: id2order[orderid]['medicines_name'] += ' | ' + one['medicines_name'] print(newlist) return JsonResponse({'ret': 0, 'retlist': newlist[0]}) # def addorder(request): # info = request.params['data'] # # with transaction.atomic(): # new_order=Order.objects.create(name=info['name'], # customer_id=info['customerid']) # # batch = [OrderMedicine(order_id=new_order.id,medicine_id=mid,amount=1) # for mid in info['medicineids']] # #批量导入,参数是一个包含所有 该表的 Model 对象的 列表 # OrderMedicine.objects.bulk_create(batch) # # return JsonResponse({'ret': 0, 'id': new_order.id}) def addorder(request): info = request.params['data'] with transaction.atomic(): medicinelist = info['medicinelist'] new_order = Order.objects.create(name=info['name'], customer_id=info['customerid'], # 写入json格式的药品数据到 medicinelist 字段中 medicinelist=json.dumps(medicinelist,ensure_ascii=False),) batch = [OrderMedicine(order_id=new_order.id, medicine_id=medicine['id'], amount=medicine['amount']) for medicine in medicinelist] OrderMedicine.objects.bulk_create(batch) return JsonResponse({'ret': 0, 'id': new_order.id}) def deleteorder(request): # 获取订单ID oid = request.params['id'] try: one = Order.objects.get(id=oid) with transaction.atomic(): # 一定要先删除 OrderMedicine 里面的记录 OrderMedicine.objects.filter(order_id=oid).delete() # 再删除订单记录 one.delete() return JsonResponse({'ret': 0, 'id': oid}) #except Order.DoesNotExist: except Order.DoesNotExist: return JsonResponse({ 'ret': 1, 'msg': f'id 为`{oid}`的订单不存在' }) except: err = traceback.format_exc() return JsonResponse({'ret': 1, 'msg': err})