零散的知识点

                     一 : Django 中的 ORM 操作

 

GET 请求

get请求中参数都会以http://xxx.com/api/getjson?param1=asdf&param2=123
这样的形式拼接在url后面.
在request对象中
request.query_params 中可以获取?param1=32&param2=23形式的参数.
request.query_params 返回的数据类型为QueryDict
QueryDict转为普通python字典. query_params.dict()即可.

1   。extend() 函数用于在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)

 

2 。 locals() 储存当前函数的所有变量

 

3  。 bulk_create  Django中插入多条数据用,减少对数据库的开关

querysetlist=[]
for i in resultlist:
    querysetlist.append(Account(name=i))        
Account.objects.bulk_create(querysetlist)

 

4 。 多个条件筛选

  条件在GET请求的参数中

  打印queryst.GET是QueryDict对象   # print("request.GET type",type(request.GET))

5 。 导入模块

  from django.http.request import QueryDict   
   request.GET._mutable=True   # 改为True, 就可以添加修改值了

  request.GET["name"]="yuan"

得到当前路径参数为字符串类型 urlencode()

  print(request.GET.urlencode()) # "nid=1&name=yuan"

 

 

 

 

深拷贝的COpy的话直接改就可以了

import copy
params=copy.deepcopy(request.GET)
params["egon"]="dsb"
print(params._mutable) # True

 

 ORM F 和 Q
  

一、Q查询

  用来进行复杂查询

    Q查询可以组合使用 “&”, “|” 操作符,当一个操作符是用于两个Q的对象,它产生一个新的Q对象,Q对象可以用 “~” 操作符放在前面表示否定,也可允许否定与不否定形式的组合。Q对象可以与关键字参数查询一起使用,不过一定要把Q对象放在关键字参数查询的前面。

复制代码
from django.db.models import Q
 
print(Book.objects.filter(Q(id=3))[0])  # 因为获取的结果是一个QuerySet,所以使用下标的方式获取结果
print(Book.objects.filter(Q(id=3)|Q(title="Go"))[0])  # 查询id=3或者标题是“Go”的书
print(Book.objects.filter(Q(price__gt=70)&Q(title__startswith="J")))  # 查询价格大于等于70并且标题是“J”开头的书
print(Book.objects.filter(Q(title__startswith="J") & ~Q(id=3)))  # 查询标题是“J”开头并且id不是3的书
print(Book.objects.filter(Q(price=70)|Q(title="Python"), publication_date="2017-09-26"))  # Q对象可以与关键字参数查询一起使用,必须把普通关键字查询放到Q对象查询的后面
复制代码
复制代码
from django.db.models import Q
 
con = Q()
q1 = Q()
q1.connector = "AND" 
            字段名 值 q1.children.append(("email", "123@qq.com")) q1.children.append(("password", "abc123")) q2 = Q() q2.connector = "AND" 默认是 and q2.children.append(("username", "abc")) q2.children.append(("password", "xyz123")) con.add(q1, "OR") con.add(q2, "OR") obj = models.UserInfo.objects.filter(con).first()

 

二、F查询   

  主要用来获取原数据进行计算。

from django.db.models import F

6 .  函数可以随意创建一个属性

    def foo(self):
    pass
    foo.short_description = "批量删除"


7 . 通过关联对象 找到表

  authors = Book._meta.get_field("authors")
  authors.model # 找到自己当前的表名
  authors.rel.to #找到当前表
  authors.rel.to.objects.all() #找到当前表的字段

 8  .# 获取字符串的 路径 把路径转化为字符串
        _url = params.urlencode()

9 。ORM 中关联字段 也可以直接filter
  models.Book.objects.filter(publish=1) 可以
  models.Book.objects.filter(publish_id=1) 也可以

思想 如果用一个方法可以获取到想要的值, 就灵活用这种方法获取上所有的值。

 10 直接获得一个id名id_author的字符串 boundfield.auto_id

 

 11  model 模型中的 null=True  和 blank+True 的区别
  • null 是针对数据库而言,如果 null=True, 表示数据库的该字段可以为空,即在Null字段显示为YES。
  • blank 是针对表单的,如果 blank=True,表示你的表单填写该字段的时候可以不填,但是对数据库来说,没有任何影响

 

ORM  中 多个需要多个字段时

    

score_choices = ((100, 'A+'),
(90, 'A'),
(85, 'B+'),
(80, 'B'),
(70, 'B-'),
(60, 'C+'),
(50, 'C'),
(40, 'C-'),
(0, ' D'),
(-1, 'N/A'),
(-100, 'COPY'),
(-1000, 'FAIL'),
)
score = models.IntegerField("本节成绩", choices=score_choices, default=-1)
# 对像.score 获取的是90, 85, 50 。。, 如何 获取 A, B+ , B ... 呢?
  语法 对象 .get_score_display()

12 我们需要修改文章的Model类,使用 ForeignKey.limit_choices_to 限制分类显示的内容,只显示符合条件的选项。

  teacher = models.ForeignKey(verbose_name="讲师", to='UserInfo', limit_choices_to={"depart_id__in": [1002, 1003]})

 13 ORm 中 queryset:

  queryset = Book.objects.all()   #  不执行sql语句, 只有在需要queryset时在执行

  特点:

    1. 可切片    queryset[0: ]    

    2. 可迭代的  for obj in queryset:   惰性查询

    3. 有缓存机制     # 在需要值时才执行sql语句, 执行一遍的结果就会放在缓存里, 下次一直用就可以
      

 

                                二  :   Javasript 中的操作

 

 

1   BM  (window)  操作  :

   window.open(url,"","width=600,height=300,top=100,left=100") # 打开一个窗口  可以设置值
  window.opener 返回的是创建当前窗口的那个父窗口的引用, 可以获取父窗口的信息
  window.close() 关闭当前窗口

 

2. js 中的操作 
  .pop() 删除最后一个值 .splice(2,2) # 参数是从哪个位置开始,后一个参数是取几个值

     indexof () 去索引位置

   location.search 属性是一个可读可写的字符串,可设置或返回当前 URL 的查询部分(问号 ? 之后的部分)

 

3  .   为一个函数绑定一个事件

  

<button onclick="f(this)" class="show2">添加数据2</button>

<p>显示数据2</p>
<p id="show2"></p>

<script>
    function f(self) {

        url="/addbook/?pop_back="+self.className;
        window.open(url,"","width=600,height=300,top=100,left=100")

    }


    function bar(arg,pop_back) {

        var ele=document.getElementById(pop_back);
        ele.innerHTML=arg;

    }

       

 4 . bootstrap   input框设置圆角

     border-radius: 4px;

 

                      三  。 python

1. 可迭代对象, 迭代器 , 生成器
 (1) 可迭代对象就是含有__iter__() 方法的 就是可迭代对象
 (2)迭代器 是含有__iter__() 方法和 __next__() 方法的事 迭代器
 (3)生成器就是函数中含有 yield 方法的 就是 生成器

  ps:  for 循环调用的就是 __iter__() 方法,如果没有就报错

 

 2. 反射

  可以用字符串的类名和方法名通过反射来获取该对象

  (1)getattr(类名,方法名)  获取该方法呀

  (2)hetattr(类名,方法名)  判断类中有没有此方法,返回True或False

  (3)  setattr(类名,方法名,类名.方法名)  #  就是把前者替换为后者额

  

class A(object):
    name="alex"
    def get(self):
        print("get....")

    def list(self):
        print("abc")
a=A()
# a.get()

# print(hasattr(a,"list"))


# getattr(a,"name") #   a.name
# getattr(a,"get")()  #   a.get()
# getattr(a,"list")()  #   a.get()

# getattr(a,"get")   # a.get
#
# setattr(a,"get",a.list)
#
# getattr(a,"get")()   # a.list

 

  (3)  类

class A(object):
def __init__(self,name,age):
self.name=name self.age=age
def __getattr__(self, item):
print("OK1234")
return item+"123"

def __getitem__(self, item):
print(666)
return item

a = A("alex",22)
print(a["name"]) # 调用__getitem__方法,item接收的是name
print(a.hobby) # 类中没有的这个方法才会调用__getattr__,item接收的是hobby

 

 

json序列化时遇到中文会默认转换成unicode  ,如何让他保留中文形式

import json
a=json.dumps({"ddf":"你好"},ensure_ascii=False)
print(a) #{"ddf": "你好"}

 

       四:  跨域 

class VueZjj(MiddlewareMixin):
def process_response(self,request, response):
if request.method == "OPTIONS": # 复杂的请求
response["Access-Control-Allow-Methods"] = "DELETE"
response["Access-Control-Allow-Origin"] = "http://localhost:8080" # 普通请求
response["Access-Control-Allow-Headers"] = "Content-Type" # 自定义的json数据
return response

 

      五 vue. js   

 

(1) Router 路径

export default new Router({
mode:"history",    #设置路径没有# 号
routes: [
{
path: '/',
name: 'home',
component: Home
}

 

(2)vue中的ajax

 在 main。js 文件中导入

import axios from 'axios'

Vue.prototype.$http=axios;

 

 

 

  六 附加的 

from urllib.parse import urlencode


post_data = {'k1':'v1','k2':'v2','k3':'v3'}

ret = urlencode(post_data)
print(ret)

 

posted @ 2019-02-20 13:19  xuerh  阅读(201)  评论(0编辑  收藏  举报