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 #获取分页后的数据
相关推荐
七七知享1 小时前
Go 语言编程全解析:Web 微服务与数据库十大专题深度精讲
数据库·web安全·网络安全·微服务·golang·web3·webkit
Faith_xzc1 小时前
Doris vs ClickHouse 企业级实时分析引擎怎么选?
大数据·数据库·clickhouse·数据库开发
m0_748235611 小时前
MySQL 实战 4 种将数据同步到ES方案
数据库·mysql·elasticsearch
曼诺尔雷迪亚兹2 小时前
2025年四川烟草工业计算机岗位备考详细内容
数据结构·数据库·计算机网络·算法
天桥下的卖艺者3 小时前
R语言使用scitable包交互效应深度挖掘一个陌生数据库
数据库·r语言·交互
H.ZWei3 小时前
鸿蒙应用开发—数据持久化之SQLite
数据库·华为·sqlite·harmonyos
jay丿3 小时前
Django ORM 中的 RelatedManager 特殊方法
数据库·django·sqlite
残月只会敲键盘3 小时前
Django中的Cookie与Session使用指南
数据库·python·django·sqlite
Allen Bright4 小时前
【MySQL基础-1】MySQL 用户管理指南:创建用户、修改密码与权限分配
数据库·mysql
半成熟 -4 小时前
mysql下载与安装、关系数据库和表的创建
数据库·mysql