自学内容网 自学内容网

django使用踩坑经历

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.name

type_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
如:让某个文件夹访问需要token

from 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, EmptyPage


def 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为键得到默认的页面1

reports:queryset对象列
reports = paging_component(reports,pagesize,page)
reports['reports'].object_list #获取分页后的数据

原文地址:https://blog.csdn.net/rootb/article/details/145282166

免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!