bbs项目学习到的知识点(orm中的extra)
注册
form组件给input 的标签 添加样式类 参见这篇博客(点击)
上传图像
1.解决 一点击图像就会直接打开上传文件的按钮
#这儿利用了 label标签和input的特殊的联动功能
<div class="form-group">
<label for="avatar">
上传头像
<img id="avatar_img" src="/static/image/default.png" alt="头像" width="" height="">
</label>
<input type="file" style="display: none" id="avatar">
</div>
jequery 注意: 返回false的情况:
- " " 即:空字符串
- 0
- -0
- undefined
- false
- null
- NaN
其他的的都返回True ,包括空数组和对象
日期归档
我们在数据库中建立一个表datatime,里边有一个字段time 类型 date
SELECT * from datetime;
结果:

现在有一个需求,我们想要取这个日期的年月,怎么办,这时候我们就用到了一个时间格式函数 ,注意这个只能用在MySQL数据库中
date_format(data,时间格式): DATE_FORMAT() 函数用于以不同的格式显示日期/时间数据
1.把字符串转为日期格式
实例:
SELECT DATE_FORMAT('2017-09-20 08:30:45', '%Y-%m-%d %H:%i:%S');
输出结果:
2017-09-20 08:30:45(日期Date格式)
我们那道题就应该这样写:
select DATE_FORMAT(time,"%Y-%m") as time from datetime;
结果:

extra()
有时候, Django 提供的查询语法不太够用. 为了满足这些边缘需求, Django 提供了 extra() 结果集修改器 - 一种提供额外查询参数的机制.
注意:这个函数只能用querset才能 调
要注意这些额外的方式对不同的数据库引擎可能存在移植性问题.(因为你在显式的书写SQL语句),除非万不得已,尽量避免这样做:
sql中可以这样写
select name ,(select count(1) from app1_author) as n from publish
但是在orm中不能这么写,只能用extra来实现
a=models.Publisher.objects.all().extra(select={'n':'select count(1) from app1_author"}) #注意sql语句不要加;加上会报错
## select提供简单数据
# SELECT age, (age > 18) as is_adult FROM myapp_person;
Person.objects.all().extra(select={'is_adult': "age > 18"}) # 加在select后面 ## where提供查询条件
# SELECT * FROM myapp_person WHERE first||last ILIKE 'jeffrey%';
Person.objects.all().extra(where=["first||last ILIKE 'jeffrey%'"]) # 加一个where条件 ## table连接其它表
# SELECT * FROM myapp_book, myapp_person WHERE last = author_last
Book.objects.all().extra(table=['myapp_person'], where=['last = author_last']) # 加from后面 ## params添参数
# !! 错误的方式 !!
first_name = 'Joe' # 如果first_name中有SQL特定字符就会出现漏洞
Person.objects.all().extra(where=["first = %s" % first_name])
# 正确方式
Person.objects.all().extra(where=["first = %s"], params=[first_name])
extra(select=None, where=None, params=None,
tables=None, order_by=None, select_params=None)
有些情况下,Django的查询语法难以表达复杂的where子句,对于这种情况, Django 提供了extra()QuerySet修改机制 。它能在QuerySet生成的SQL从句中注入新sql语句,extra可以指定一个或多个参数,例如select、where或tables。 这些参数都不是必须的,但是至少要使用一个。注意是Queryset才能调用extra()函数
参数之select
The select 参数可以让你在 SELECT 从句中添加其他字段信息,它是一个字典,存放着属性名到 SQL 从句的映射。
queryResult=models.Article
.objects.extra(select={'is_recent': "create_time > '2017-09-05'"})
结果集中每个 Entry 对象都有一个额外的属性is_recent, 它是一个布尔值,表示 Article对象的create_time 是否晚于2017-09-05.
例题:
date_list=Article.objects.filter(user=user).extra(select={"create_ym":'DATE_FORMAT(create_time,"%%Y-%%m")'})
.values("create_ym").annotate(c=Count("nid"))\
.values("create_ym","c")#这里要注意在SQL中表示年月格式是这样的DATE_FORMAT(create_time,"%Y-%m"),d但是在extra中需要再加一个%
以后工作中尽量使用extra函数,有很大的bug
参数之where
在BBS中如果你用mysql作为数据库时它有很大的一个bug至少是我认为的,它不能用字段__month来过滤出月份来,但是用字段__year可以过滤出年份来
比如这个代码就不能执行
article_list = Article.objects.filter(user=user).filter(create_time__year=year, create_time__month=month)
这里必须用extra的参数where:
article_list = Article.objects.filter(user=user).extra(where=["YEAR(create_time)=%s and Month(create_time)=%s"],params=[year,month]) #where=列表里写上
SQL语句,如果有参数,就用params=列表里写上参数,注意params这个名称不能改变
django事务
Django的默认事务处理行为
Django 的默认行为是运行在自动提交模式下。 任何一个查询都立即被提交到数据库中,除非激活一个事务。 详细信息请参考下文。
Django 用事务或者保存点去自动的保证复杂ORM各种查询操作的统一性,尤其是 delete() 和update() 查询.
开启事务的方式有两种种详细见:https://www.cnblogs.com/clschao/articles/10463267.html
很好的一篇文章:https://www.cnblogs.com/HZHST/p/11479732.html
全局开启事务和局部开启事务
全局开启事务,很少用,我们来聊一下,局部局开启事务
atomic
Django提供了单一的API来控制数据库事务。
在Django中可以通过django.db.transaction模块提供的atomic来定义一个事务,atomic提供两种用法,一种是装饰器,一种是with语句。
atomic(using=None, savepoint=True)-
atomic接受一个using参数,它必须是数据库的名字。 如果这个参数没提供,Django默认使用"default"数据库。 -
原子性是由数据库的事务操作来界定的。
atomic允许我们在执行代码块时,在数据库层面提供原子性保证。 如果代码块成功完成, 相应的变化会被提交到数据库进行commit; 如果执行期间遇到异常,则会将该段代码所涉及的所有更改回滚。atomic块可以嵌套。 在下面的例子里,使用with语句,当一个内部块完成后,如果某个异常在外部块被抛出,内部块上的操作仍然可以回滚(前提是外部块也被atomic装饰过)。
第一种方式
from django.db import transaction
with transaction.atomic():
if pid: #说明是子评论
#找到回车键的索引
a=content.find("\n")
#切片
content=content[a+1:]
comment = Comment.objects.create(content=content, article_id=article_id, user_id=user_id,parent_comment_id=pid)
#如果是根评论 parent_comment_id 不需要赋值
else:
comment= Comment.objects.create(content=content,article_id=article_id,user_id=user_id)
Article.objects.filter(pk=article_id).update(comment_count=F("comment_count") + 1)
第二种方式:
from django.db import transaction @transaction.atomic
def viewfunc(request):
# This code executes inside a transaction.
do_stuff()
前端页面知识点
富文本编辑器(kindedit)
详细信息见官方文档
HTML部分页面
<script>
KindEditor.ready(function (K) {
window.editor = K.create('#text_area', { width: "700px",
uploadJson:"/upload_file/",
extraFileUploadParams : {
"csrfmiddlewaretoken": $("[name='csrfmiddlewaretoken']").val(),
} });
}); </script>
bbs项目学习到的知识点(orm中的extra)的更多相关文章
- BBS项目知识点汇总
目录 bbs项目知识点汇总 一. JavaScript 1 替换头像 2 form表单拿数据 3 form组件error信息渲染 4 添加html代码 5 聚焦操作 二 . html在线编辑器 三 . ...
- 中小研发团队架构实践之生产环境诊断工具WinDbg 三分钟学会.NET微服务之Polly 使用.Net Core+IView+Vue集成上传图片功能 Fiddler原理~知多少? ABP框架(asp.net core 2.X+Vue)模板项目学习之路(一) C#程序中设置全局代理(Global Proxy) WCF 4.0 使用说明 如何在IIS上发布,并能正常访问
中小研发团队架构实践之生产环境诊断工具WinDbg 生产环境偶尔会出现一些异常问题,WinDbg或GDB是解决此类问题的利器.调试工具WinDbg如同医生的听诊器,是系统生病时做问题诊断的逆向分析工具 ...
- SQLAlchemy 学习笔记(三):ORM 中的关系构建
个人笔记,不保证正确. 关系构建:ForeignKey 与 relationship 关系构建的重点,在于搞清楚这两个函数的用法.ForeignKey 的用法已经在 SQL表达式语言 - 表定义中的约 ...
- auth复习和BBS项目的登录(1)
auth复习 auth组件 验证:authenticate(request,username='andy',password='123) 登录:login(request,user) 注销:login ...
- python 自动化之路 day 20 Django进阶/BBS项目【一】
一.django进阶 1.django orm 增删改查 1.1.创建表: 1 2 3 >>> from blog.models import Blog >>> b ...
- atitit 商业项目常用模块技术知识点 v3 qc29
atitit 商业项目常用模块技术知识点 v3 qc29 条码二维码barcodebarcode 条码二维码qrcodeqrcode 条码二维码dm码生成与识别 条码二维码pdf147码 条码二维码z ...
- 阅读《LEARNING HARD C#学习笔记》知识点总结与摘要三
最近工作较忙,手上有几个项目等着我独立开发设计,所以平时工作日的时候没有太多时间,下班累了就不想动,也就周末有点时间,今天我花了一个下午的时间来继续总结与整理书中要点,在整理的过程中,发现了书中的一些 ...
- BBS项目详解(forms快速创建登陆页面,登陆验证、通过阅读器进行头像上传的预览、内存管理器)
BBS项目涉及的知识点 django中知识点 钩子函数(局部钩子和全局钩子) 1.局部钩子就是用来做合法性校验,比如用户名有没有被使用等 2.全局的就是用来做对比校验,比如两次输入的密码是否一致 3. ...
- Python示例项目学习
原文地址:http://www.360doc.com/showweb/0/0/874025604.aspx 「 Python3 实现火车票查询工具 」 相信很多人学Python都是冲着它强大的爬虫 ...
随机推荐
- VS2013 中 CString类型转换为LPCSTR类型
HWND hWnd = ::FindWindow(NULL, L"XXXXXXX"); if (hWnd != NULL) { DWORD dwReadBytes; unsigne ...
- PHP的openssl_encrypt方法的Java实现
<?php class OpenSSL3DES { /*密钥,22个字符*/ const KEY='09bd821d3e764f44899a9dc6'; /*向量,8个或10个字符*/ cons ...
- 利用itext将html页面转成pdf(不模糊)
1.maven项目进入依赖 <dependency> <groupId>org.xhtmlrenderer</groupId> <artifactId> ...
- F7+vue 物理返回键监听使用
以前使用的是纯F7,这个项目加了Vue进去,但碰到了一个问题,就是这样监听不到安卓物理键的返回,它是点击返回,直接推出程序,这个坑有点深,查了不少资料也问了不少人,最后在网上看到了别人的写的,自己也改 ...
- git(三) 使用github
1.创建仓库 ① 注册github账户,登录后,点击"New respository ". ② 在新页面中,输入项目的名称,勾选'readme.md',点击'create repo ...
- PHP语言学习之php-fpm 三种运行模式
本文主要向大家介绍了PHP语言学习之php-fpm 三种运行模式,通过具体的内容向大家展示,希望对大家学习php语言有所帮助. php-fpm配置 配置文件:php-fpm.conf 开启慢日志功能的 ...
- thinkphp5 图片下载保存
基础架构 thinkphp 5 实现效果:网络图片保存到本地(项目中制定路径) 代码片段 (png格式图片下载) $qrcodeurl="http://localhost:8081/ymfi ...
- Haxe东游记(上)part1.5:roadmap
part1.6 = 常用API参考 1.5.7 -> 官方手册目录/总结/中文化 1.8 -> 官方示例/讲解/总结 1.5.6-> haxe整体结构/解析/综述 part2 = 中 ...
- JS的全局变量与局部变量及变量的提升
遇到全局变量与局部变量的时候总是出一些或多或少的问题,于是专门花时间去认真研究了一下全局变量与局部变量. 这是在网上看到的一个关于全局变量与局部变量的代码,看了下作者的解析,自己也进行了研究. < ...
- OSI,TCP/IP,五层协议的体系结构,以及各层协议
OSI分层 (7层):物理层.数据链路层.网络层.传输层.会话层.表示层.应用层. TCP/IP分层(4层):网络接口层. 网际层.运输层. 应用层. 五层协议 (5层):物理层.数据链路层.网络层. ...