Django框架学习易错和易忘点
一、get在几处的用法
1.获取前端数据
request.POST.get('xxx') #当存在多个值时,默认取列表最后一个元素;所以当存在多个值时,使用getlist
2.获取数据库数据
models.User.objects.get(xxx=yyy) #get()方式返回的是单个对象,如果符合条件的对象有多个就会报错,所以我们一般用的是filter()
二、路由层设置
无名分组
路由层:url(r'^index/(d+)/', views.index) 必须用括号,按位置参数传参
视图层:视图函数必须要用一个参数来接收,参数名可以随便取,也可以用*args
def index(request,xxx) 或者 def index(request,*args)
有名分组
路由层:url(r'^index/(?P<year>d+)/', views.index) 注意P要大写,按关键字传参给视图函数
视图层:视图函数接收的参数名必须要和路由层传的参数名一致,或者用**kwargs接收多个参数
def index(request,year) 或者 def index(request,**kwargs)
F查询的本质就是从数据库中获取某个字段的值,之前查询等号后面的条件都是我们人为输入的,现在变成了需要从数据库中获取数据放在等号后面
查询库存量大于卖出量的书籍
from django.db.models import F
res = models.Book.objects.filter(kucun__gt=F('maichu')) #kucun和maichu都是Book表的字段
将书籍库存数全部增加1000
models.Book.objects.update(kucun=F('kucun')+1000)
把所有书名后面加上'新款'
from django.db.models.functions import Concat
from django.db.models import Value
ret3 = models.Book.objects.update(title=Concat(F('title'), Value('新款')))
models.Book.objects.update(title = F('title')+'新款') # 不能这么写
Q查询 (filter里面条件都是与,Q支持与或非)
查询书籍名称是三国演义或者价格是444
from django.db.models import Q
res = models.Book.objects.filter(title='三国演义',price=444.44) # filter只支持and关系
res1 = models.Book.objects.filter(Q(title='三国演义'),Q(price=444)) # 如果用逗号 那么还是and关系
res2 = models.Book.objects.filter(Q(title='三国演义')|Q(price=444)) #或者关系
res3 = models.Book.objects.filter(~Q(title='三国演义')|Q(price=444)) #查询除了title是三国演义,或者价格是444的书籍