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 #获取分页后的数据
相关推荐
kngines1 小时前
【PostgreSQL数据分析实战:从数据清洗到可视化全流程】电商数据分析案例-9.4 可视化报告输出
postgresql·数据分析·ipywidgets·pg_cron·gmv·商品交易总额
老华带你飞1 小时前
音乐网站|基于SprinBoot+vue的音乐网站(源码+数据库+文档)
java·前端·数据库·vue.js·论文·毕设·音乐网站
gadiaola6 小时前
MySQL从入门到精通(三):MySQL数据类型、SQL语言—DDL
数据库·sql·mysql·database
muxue1787 小时前
关于almalinux分区配置:
linux·运维·数据库
kngines7 小时前
【PostgreSQL数据分析实战:从数据清洗到可视化全流程】8.4 数据故事化呈现(报告结构设计/业务价值提炼)
postgresql·数据分析·趋势预测模型·移动平均·cpa·生存分析模型·归因模型
海天胜景8 小时前
Asp.Net Core IIS发布后PUT、DELETE请求错误405
数据库·后端·asp.net
凯子坚持 c8 小时前
【金仓数据库征文】金仓数据库 KES:MySQL 迁移实用指南
数据库·金仓数据库 2025 征文·数据库平替用金仓
小刘|8 小时前
Redis 中简单动态字符串(SDS)的深入解析
数据库·redis·bootstrap
怀君10 小时前
Flutter——数据库Drift开发详细教程(四)
数据库·flutter
万能程序员-传康Kk10 小时前
中国邮政物流管理系统(Django+mysql)
python·mysql·django