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 #获取分页后的数据
相关推荐
IT利刃出鞘12 分钟前
WordPress插件--Redis Object Cache对象缓存插件的用法
数据库·redis·缓存
面向星辰25 分钟前
sql通配符(大量查找搜索索引)
数据库·sql
斐硕人27 分钟前
SQL滚动求和
数据库·sql·mysql·maxcompute
爬山算法1 小时前
Redis(135)Redis的网络模型是什么?
网络·数据库·redis
L.EscaRC1 小时前
Redis大Key与内存不足问题深度解析与应对策略
数据库·redis·缓存
雲烟1 小时前
Qt SQLite在I.mx8上使用问题
数据库·qt·i.mx8
TDengine (老段)2 小时前
TDengine 转换函数 CAST 用户手册
java·大数据·数据库·物联网·时序数据库·tdengine·涛思数据
苦瓜炒蛋挞2 小时前
小迪安全第二十二天-安全开发-PHP应用&数据库操作&留言板功能&第三方插件
数据库·网络安全·php·小迪安全
chushiyunen2 小时前
redis命令 geo(对地理坐标的支持)
数据库·redis·缓存
baivfhpwxf20233 小时前
删除数据表SQL,不是删除数据,是删除表结构
数据库·sql