DRF
使用drf獲取序列化后的id
visitor_serializer = VisitorSaveSerializer(data={…})
if visitor_serializer.is_valid():visitor = visitor_serializer.save() visitor_id = visitor.pk
postgrepsql踩坑
django使用postgrepsql,使用聚合函數如:sum 等,被引用的字段必須是浮點數或者整數,不能是字符串
解析Excel
注:如果xlrd版本不合適可導致出現:Excel xlsx file not supported報錯
原因:xlrd1.2.0之后的版本不支持xlsx格式,支持xls格式
辦法一:
卸載新版本 pip uninstall xlrd
安裝老版本:pip install xlrd=1.2.0 (或者更早版本)
方法二:
將xlrd用到的excel版本格式修改為xls(保險起見,另存為xls格式)
建議:個人更推薦使用第二種方法
filename = request.FILES.get('file') #獲取文件name = filename.nametype_excel = name.split(".")[1]
if type_excel in ['xlsx','xls']: #判斷文件是否#開始解析表格wb = xlrd.open_workbook(filename=None, file_contents=filename.read())table = wb.sheets()[0]nrows = table.nrows # 行數item_list = []try:for specific in range(2, nrows): # 從0開始把表頭省略則讀取表頭信息,如果從1開始則直接讀取數據rowValues = table.row_values(specific) # 一行的數據:list
時間查詢
按照周查詢now_time = datetime.datetime.now()# 距離周日相隔的天數,這里得到int型數值day_num = now_time.isoweekday()# 查周日的日期,現在時間減去相隔天數得出周日的日期week_day = (now_time - datetime.timedelta(days=day_num))# 改格式,將datetime類型轉換為date類型monday = week_day.date()query_order = CrmOrder.objects.filter(order_time__range=(monday,now_time))
setting配置
DATA_UPLOAD_MAX_MEMORY_SIZE = 10485760 #數據上傳最大內存大小,默認2.5mb,這里設置成最大10mb
apscheduler定時任務
#注意:定時任務執行的函數需要寫入路由
根據某個時間去創造定時任務
INSTALLED_APPS =[
'django_apscheduler'
]from apscheduler.schedulers.background import BackgroundScheduler
from django_apscheduler.jobstores import DjangoJobStore, register_job, register_events# 實例化調度器
scheduler = BackgroundScheduler()
scheduler.add_jobstore(DjangoJobStore(),"default")#根據重啟時間創建定時任務 到時間發送消息給申請人詢問是否要重啟項目
message_prompt:需要執行的函數 其他參數:年月日時分秒scheduler.add_job(message_prompt, "cron", year=recovery_time.year, month=recovery_time.month,day=recovery_time.day,hour=recovery_time.hour, minute=recovery_time.minute, kwargs={'id':info_poj.id},coalesce=False)
指定時間去執行函數
# 實例化調度器
scheduler = BackgroundScheduler()
# 調度器使用crm_order_add
seconds定時多長時間執行 秒單位
scheduler.add_job(crm_order_add, "interval", seconds=1800, args=['requeat']) # 半小時執行一次接口
# 監控任務——注冊定時任務
register_events(scheduler)
# 調度器開始運行
scheduler.start()
獲取url.py的name
current_url = request.resolver_match.url_name
中間件
創建mymiddleware文件夾,創建自己的中間件py
如:讓某個文件夾訪問需要tokenfrom django.http import HttpResponseRedirect, HttpResponse
from django.utils.deprecation import MiddlewareMixin# 設置路由需要驗證的名單
from center.models import Users# whiteUrls = ['media']
#
# class UserAuthMiddleWare(MiddlewareMixin):
# #訪問路由需要token驗證
# def process_request(self, request):
# print(request.path)
# pat = request.path #訪問路徑
#
# if pat.split('/')[1] in whiteUrls:
# token = request.META['HTTP_AUTHORIZATION'] if 'HTTP_AUTHORIZATION' in request.META else None
# try:
#
# userinfo = Users.objects.filter(token=token).first()
# except Exception as e:
# return HttpResponse("PleaseStayAway!")
# if userinfo is None:
# return HttpResponse("PleaseStayAway!")在setting的MIDDLEWARE中導入
MIDDLEWARE = ["mymiddleware.中間件名稱.UserAuthMiddleWare"
]
即可
分頁工具
#工具函數
from django.core.paginator import Paginator, PageNotAnInteger, EmptyPagedef paging_component(reports,pagesize,num_p):""":param reports: 對象數據:param pagesize: 一頁顯示多少個。默認3個:param num_p: 第幾頁:return: 分頁后的對象數據"""paginator = Paginator(reports, pagesize)count = paginator.count # 需要分類數據的對象總數num_pages = paginator.num_pages # 需要分類數據的對象總數try:reports = paginator.page(int(num_p))except PageNotAnInteger:reports = paginator.page(number=1)except EmptyPage:reports = paginator.page(1)# print(reports)return {"reports":reports,"count":count,"num_pages":num_pages}#使用方法
pagesize = request.GET.get('pagesize', 10) #pagesize 一頁顯示多少個。默認3個
page = request.GET.get('page', 1) # 以page為鍵得到默認的頁面1reports:queryset對象列
reports = paging_component(reports,pagesize,page)
reports['reports'].object_list #獲取分頁后的數據