零散的知识点
一 : Django 中的 ORM 操作
GET 请求
get请求中参数都会以http://xxx.com/api/getjson?param1=asdf¶m2=123
这样的形式拼接在url后面.
在request对象中
request.query_params 中可以获取?param1=32¶m2=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
一、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:
三 。 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)