为什么这里说是"非入门级"用法呢,因为我个人觉得这是我接触Django之后一段时间才开始了解的用法,但是说是高级用法又太夸张了,所以用了这么一个诡异的”非入门级“的定位。 下面的示例中使用下面的model,简单描述一下并非真实代码 0X00 使用Avg()/Sum()/Count()/Max()/Min() 这些方法的用法很简单,顾名思义。不过需要配合下面介绍的annotate()或aggregate()使用。 from django.db.models import Avg, Sum, Count, Max, Min name | function | Avg | 求平均数 Sum | 求和 Count | 计数 Max | 求最大 Min | 求最小 0X01 使用annotate() 最基础的查询就是从一张表中查询符合某条件的字段,而使用annotate()可以得到一些我们手动计算得到的值,并将其作为Queryset中Item的一个属性来调用。…
自从一咬牙购入了一台Synology之后感觉网络和存储的体验提升了很多。在这里总结一下购买理由,方便犹豫不决的朋友做个参考。 0X00 来自百度云盘的惊悚事件 国内云盘一波洗牌过后,常用的几家都已经GG了,仅有一家百度还存活着。不过百度云说起来是免费的,实际如果使用的比较多的话就会发现,如果不充值为会员的话,速度就会非常的慢。所以说百度云盘也几乎是一个收费的网盘,超级会员算下来要将近30元/月。 其实收费无可厚非,毕竟大家花钱享受服务嘛。不过直到一天,在网上看到了这样一件事: 一个人在自己的百度云盘中上传了大量自己拍摄的照片(纯一手自己拍摄的),过段时间后因为一些原因从百度云盘手动删除了。又过了不短的一段时间 ,该用户再次将自己的这些照片上传至百度云盘,发现居然所有图片都是使用 急速秒传…
0X00 内容比较少,不分标题 我们对Django中的model进行查询时通常是某个字段和一个常量 对比,比如下面这种写法 如果遇到高级的查询可能会使用Q()查询,不过也只是进行多个条件的查询 这里是我的另一篇介绍Q()的博文。 但是如果有这样一个需求:”查询订单中结束时间和开始时间的间隔大于45分钟的“。那应该怎么办的?因为订单的开始时间和结束时间都是一个字段,我们需要对比同一条数据中的两个字段。这时候可以使用F()来查询。 本段内容的官方文档:<https://docs.djangoproject.com/en/2.1/ref/models/expressions/#f-expressions> 本段内容的另一篇博客:<https://www.cnblogs.com/liuq/p/5946803.html>
Python一切皆对象 0X00 困扰我的一个问题 前两天在工作上遇到了个问题,说来很简单:我要在每天的固定时刻统计系统中当天产生的一些数据并且用邮件发送给指定的人,又考虑到了程序的可复用性(统计其他日期)我并没有把参数写死,而是将其默认为当天的日期并可以指定参数。很容易我就写出了类似下面的代码。Ps.伪代码,不要过分纠结。 并且将其配置在Celery中,每晚执行,并且在得到了第一天的正确数据后默认程序正确了。第二晚虽然收到了统计数据的邮件,但是发现日期是前一天的。以为是Celery或是服务器时间同步问题或是缓存等导致的,但是在多次检查后没有发现这个问题的根本原因。故临时使用crontab去执行这个定时任务,但这并不是长久之计。 0X01 到底发生了什么 纠结问题所在的时候突然想到“会不会函数的默认值在函数初次初始化的时候生成好就不再变了?”故而使用下面这段代码来检验自己的推断。 果然输出的结果和我以前的设想不同,按照我以前的想法应该是输出的几个时间间隔为1s,但是结果却是每一行都相同(果然我的1s不见了)。 0X02 那是为什么呢 Python一切皆对象…
内容比较少,只是今晚翻看教程的时候发现的几个可以替换调我以前一些诡异操作的方法,将其整理贴出。 0X00 git blame 是谁在代码里下了毒?是谁用了一个超酷炫的方法解决了你解决不了的问题?当你想知道仓库中的某行代码是谁提交的,就可以使用这个方法。git blame hello.py可以看到hello.py这个文件所有行的提交人是谁,于何时提交的。而且这个命令最常用的是和grep合用,git blame hello.py | grep prinft(是谁写错了这个单词+_+) 上面的例子是oh-my-zsh中README的部分输出 0X01 git commit --amend 如果你不小心把刚刚的commit写错了,现在还来得及后悔。 如果你刚刚commit,还没有进行新的改动,那么可以使用git commit --amend来修改上一次的commit。输入命令回车之后会打开你的编辑器,最上面的就是本次提交的commit message,动手修改之后保存就可以了。如果commit之后改动了很多才想起来那也可以先git add .再git…
0X00 遇到了什么 我们使用git,绝大多数情况下都是大于等于一个人进行代码编辑,然后将自己的改动提交到github/gitlab/gogs等仓库,然后再通过pull request/merge request的方式进行代码合并。所以我们一般都是先从github上创建一个新的项目,然后按照向导在自己的本地git clone下来一个空项目,再提交代码上去;或者fork & clone的流程。 以前从来没有去想过github上的仓库是不是和我本地的相同,以至于今天第一次搭建自己的git服务时遇到了问题。我从服务器上一顿操作猛如虎mkdir xxx; cd xxx; git init; touch README.md; git add .; git commit -m "init the repository",结果不小心成了二百五。因为这个仓库根本不能clone到我本地,经过一番搜索发现了git中仓库之间的关系没有这么简单。 0X01 git中一般的repository git中一般的repository通常有两个来源:git clone或者在git…
本来准备总结一下Linux桌面系统使用一年以来的一些感受,以及为什么选择Linux作为桌面系统工作学习的,但是构思了半个小时也没能想到要写些什么。所以还是来推荐一下一年以来在Linux桌面平台下的软件体验和推荐吧。由于我这一年多以来一直使用的是Fedora Workstadion,所以并不能保证这些软件能在其他平台下的体验与我一致,不过一般来说都是没有问题的呢。 0X00 vim + spacevim 首先说明我不认为Vim比IDE写代码更好用,但是我仍然在使用vim。一个原因是觉得使用盗版IDE有些不太道德,另一个也是想要提升一下自己的代码水平,毕竟vim给出的提示会更少一些。IDE用户可以在IDE上安装vim的操作插件,毕竟vim的操作方式还是能很大程度上提升效率的。 SpaceVim 呢是vim的一个插件打包配置集成之后的一个版本。由于它集成了大量精选插件和配置,所以用起来很舒服,就把他当成一个高级的文本编辑器来用就好的。spacevim还有官方的中文文档可以查阅,虽然学习成本相对高一些,但是带来效率和爽快感的提升可不是一点点的。 0X01 ulaunch…
0X00 Sentry是什么 Sentry是一个统一收集整理程序异常错误的服务。如果你有一个程序在跑,并且配置了日志,那么可以轻松的找到程序出错的地方;甚至可以在报错后发邮件通知自己以便抓紧处理。但是如果你的团队有10个项目和50个人,并且这50个人并不是每人只负责一个项目,此时此刻该怎么办呢?难道为每个项目都配置很多人,并且在人员变动和项目变动的时候都去再修改吗?这样就未免有点傻了,Sentry就是用来做这个的。 你可以在Sentry上为每个项目创建一个Project用于收集项目的错误,再为每位成员创建用户,由用户去关注项目,就可以实现上述复杂的功能了。 0X01 如何部署 为了流程简洁,默认安装了docker和docker-compose。 上述命令执行完成后,输出的最后一行类似乱码的东西是我们所需的secret-key,将其复制粘贴之docker-compose.yml文件的SENTRY_SECRET_KEY后面,形似 SENTRY_SECRET_KEY: '***' SENTRY_MEMCACHED_HOST: memcached 然后初始化数据库docker-compose…
0X00 什么是“事务” “事务”简单的说就是把一些数据库操作打包起来,要么就全部执行要么就全部不执行。 假设有一个操作是新建一个学生信息,有多张表分别记录了“基本信息、家庭信息、学校信息等“,那么就需要分成多步来新增这个学生的信息。但是如果在添加了”基本信息和家庭信息“两张表的内容后在添加”学校信息“时出现了错误那么数据库中就会存在该学生部分信息,从而使得数据库中的数据出现错误。 如果将这些操作放到一个”事务“中执行就可以在中途出现错误的时候所有数据库操作都不生效,当顺利执行完成之后使所有数据库操作都生效。总的来说就是”事务中出现错误则所有数据库操作都不生效,否则所有数据库操作均生效“。 具体可参见下面几个链接 Database transaction - Wikipedia MySQL Document 0X01 将事务绑定到http请求…
0X00 Django Model中的空 Django的Model常见两个与空有关的参数:null和blank。其中null是数据库层面的是否允许为Null,而blank则将空处理为空值。比如一个CharField的blank=True,那么这个字段在没有赋值的情况下入库,这个字段就会是空字符串而不是Null。 如果将blank=False再不赋值该字段进行保存则入库的就是Null。 所以换句话说,null=True是数据库层面允许存储Null,而blank=True则是允许存入"空字符串"等表示空的值。 0X01 Django REST framework中的空 在Django REST framework的serializer中的字段,有三个与空有关的,都是在创建或更新中生效。分别是allow_blank/allow_null/require这三个。其中allow_blank=True表示着CharField/ListField等允许传入""/[]等空值;allow_null=True表示着允许传入{"name": null, "age":…