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 #获取分页后的数据
相关推荐
ClickHouseDB3 小时前
ClickHouse Cloud 与 Snowflake 实时性价比对比:CostBench 测试中的 412 倍差距来
运维·数据库·系统架构
m0_639906943 小时前
Redis入门|五种数据结构、使用场景、持久化RDB&AOF
数据结构·数据库·redis
时间售卖铺4 小时前
触发器与函数实战:MySQL高效编程秘诀
运维·数据库·mysql·云原生
qetfw4 小时前
UOS MariaDB 数据库:安装、最小权限与备份验证
linux·数据库·mariadb·uos
数智园区合作社5 小时前
问数平台怎么把同一个指标锁成一个数
大数据·数据库·人工智能·ai
lbb 小魔仙5 小时前
Windows搭建PaddleOCR+飞书Webhook自动打卡通知机器人:识别、推送与远程触发完整教程
数据库·人工智能·prometheus·时序数据库
captain3766 小时前
MyBatis操作数据库(入门2)
java·数据库·spring boot·后端·spring·mybatis
心中有你02147 小时前
Java实现Dijkstra最短路径算法(邻接表 + 优先队列)
java·数据库·算法
龙亘川7 小时前
综合素质评价业务建模:从过程性评价到成长档案全链路闭环
数据库·智慧城市·数据可视化
数据库小组7 小时前
NineData 实战教程:MySQL 5.5 数据迁移同步到 MySQL 8.0(跨版本升级)
数据库·mysql·mysql优化·数据库开发·数据库迁移·版本升级·数据复制