def post(self, request): # 获取到当前用户的id user = request.user # 获取到传入的参数 dict_data = json.loads(request.body.decode()) house_id = dict_data.get('house_id') start_date_str = dict_data.get('start_date') end_date_str = dict_data.get('end_date') # 校验参数 if not all([house_id, start_date_str, end_date_str]): return http.JsonResponse({"errno": RET.PARAMERR, "errmsg": "参数错误"}) try: start_date = datetime.datetime.strptime(start_date_str, "%Y-%m-%d") end_date = datetime.datetime.strptime(end_date_str, "%Y-%m-%d") assert start_date < end_date, Exception('开始日期大于结束日期') # 计算出入住天数 days = (end_date - start_date).days except Exception as e: logger.error(e) return http.JsonResponse({"errno": RET.PARAMERR, "errmsg": "参数错误"}) # 判断房屋是否存在 try: house = House.objects.get(id=house_id) except Exception as e: logger.error(e) return http.JsonResponse({"errno": RET.NODATA, "errmsg": "房屋不存在"}) # 判断房屋是否是当前登录用户的 if user.id == house.user.id: return http.JsonResponse({ "errno": RET.ROLEERR, "errmsg": "不能订购自己的房间" }) # 查询是否存在冲突的订单 try: filters = { "house": house, "begin_date__lt": end_date, "end_date__gt": start_date } count = Order.objects.filter(**filters).count() except Exception as e: logger.error(e) return http.JsonResponse({"errno": RET.DBERR, "errmsg": "数据库查询错误"}) if count > 0: return http.JsonResponse({ "errno": RET.DATAERR, "errmsg": "房间已经被预定" }) amount = days * house.price # 生成订单的模型 order = Order() order.user = user order.house = house order.begin_date = start_date order.end_date = end_date order.days = days order.house_price = house.price order.amount = amount try: order.save() except Exception as e: logger.error(e) return http.JsonResponse({"errno": RET.DBERR, "errmsg": "数据库保存失败"}) return http.JsonResponse({ "errno": RET.OK, "errmsg": "发布成功", "data": { "order_id": order.pk } })