zoukankan      html  css  js  c++  java
  • 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="40" height="40">
                        </label>
                        <input type="file" style="display: none" id="avatar">
                    </div>

    jequery 注意: 返回false的情况:

    1. " " 即:空字符串
    2. 0
    3. -0
    4. undefined
    5. false
    6. null
    7. 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=Nonesavepoint=True)
         atomic接受一个using参数,它必须是数据库的名字。 如果这个参数没提供,Django默认使用"default"数据库。

    原子性是由数据库的事务操作来界定的。 atomic允许我们在执行代码块时,在数据库层面提供原子性保证。 如果代码块成功完成, 相应的变化会被提交到数据库进行commit; 如果执行期间遇到异常,则会将该段代码所涉及的所有更改回滚。

    atomic块可以嵌套。 在下面的例子里,使用with语句,当一个内部块完成后,如果某个异常在外部块被抛出,内部块上的操作仍然可以回滚(前提是外部块也被atomic装饰过)。

     第一种方式

    from django.db import transaction
     with transaction.atomic():
            if pid: #说明是子评论
                #找到回车键的索引
                a=content.find("
    ")
                #切片
                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', {
    
                 "700px",
                uploadJson:"/upload_file/",
                extraFileUploadParams : {
                    "csrfmiddlewaretoken": $("[name='csrfmiddlewaretoken']").val(),
                }
    
            });
        });
    
    </script>
  • 相关阅读:
    C++指针
    写的第一个 JavaCript
    VB.NET中实现"关机/休眠/重启/注销"的类
    VB&VB.NET速查表
    把一个数组的值赋给另一个数组(VB.NET)
    设置装备陈列.htaccess的一些问题结果总结
    httpd.conf文件设置装备布置详解2
    httpd.conf文件设置装备安放详解3
    httpd.conf文件设置详解1
    Red Hat下若何架设FTP做事器
  • 原文地址:https://www.cnblogs.com/sticker0726/p/8424453.html
Copyright © 2011-2022 走看看