day50 Django的url路由补充和数据库操作
day50 Django的url路由补充和数据库操作
url别名和反向解析
给路径取别名,当路径改变时,不需要改变视图函数和代码中的引用方式。
urls文件中的写法:
url(r'^login/v2/', views.login,name='xx'),
视图中反向解析:
from django.urls import reverse
# 也可以直接从 django.shortcuts 中导入reverse,从源码来看,这两个reverse是相同的。
def login(request):
print(reverse('xx')) #/login/v2/
if request.method == 'GET':
return render(request,'login.html')
else:
uname = request.POST.get('uname')
pwd = request.POST.get('pwd')
if uname == 'chao' and pwd == '123':
return HttpResponse('ok')
else:
return redirect(reverse('xx')) #使用反向解析
html模板渲染时反向解析的语法{% url 别名 %}
<form action="{% url 'xx' %}" method="post"> <!-- 这里是反向解析 -->
{% csrf_token %} <!-- csrf_token 用于防御跨站请求伪造-->
用户名:<input type="text" name="uname">
密码:<input type="text" name="pwd">
<input type="submit">
</form>
include路由分发
- 项目文件夹下的
urls.py
文件中写上以下内容
from django.conf.urls import url,include
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^app01/', include('app01.urls',namespace='app01')),
url(r'^app02/', include('app02.urls',namespace='app02')),
#http://127.0.0.1:8000/index/
]
- 在各个app应用文件夹下面创建
urls.py
文件,在urls.py
文件中写自己应用的各个路径,比如app01
和app02
app01:
from django.conf.urls import url, include
from django.contrib import admin
from app01 import views
urlpatterns = [
url(r'^index/', views.index,name='index'),
]
app02:
from django.conf.urls import url, include
from django.contrib import admin
from app02 import views
urlpatterns = [
url(r'^index/', views.index,name='index'),
]
- 在各个应用中写各自的视图函数,当需要进行路径分发时,使用这样的格式:
return redirect('app01:index')
url命名空间
基本写法:
url(r'^app01/', include('app01.urls',namespace='app01')),
views.py
文件中写法:
from django.urls import reverse
def index(request):
print('app01反向解析:', reverse('app01:index'))
# app01反向解析: /app02/index/
return HttpResponse('app01-index')
html
中写法:
{% url 'app01:login' %}
数据库操作
orm
object relational mapping,对象关系映射
使用:
- 在应用文件夹下面的models.py文件中写对应的类,看下面的示例:
class UserInfo(models.Model):
id = models.AutoField(primary_key=True)
username = models.CharField(max_length=10)
password = models.CharField(max_length=32)
- 到mysql数据库中创建一个库,比如名为orm01:
create database orm01;
- 做数据库配置,默认使用的数据库是轻量的SQLite:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
我们需要在settings.py
文件将数据库配置成以下格式:
#连接mysql的配置:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME':'orm01',
'HOST':'127.0.0.1',
'PORT':3306,
'USER':'root',
'PASSWORD':'123'
}
}
- 在项目文件夹下的的
__init__.py
文件中写上以下内容,来指定pymysql
作为连接客户端
import pymysql
pymysql.install_as_MySQLdb()
- 执行数据库同步指令,在终端中执行
python manage.py makemigrations #在migrations文件夹下面生成记录文件
python manage.py migrate #执行记录文件
表就创建好了,我们的表名就是: 应用名_类名小写
在终端中,通过数据库命令就能看到我们刚刚建好的表了。
表中数据的增删改查
增加(创建)
方式1
obj = models.UserInfo(
username='alex',
password='sb'
)
obj.save()
方式2(常用)
models.UserInfo.objects.create(
username='一峰',
password='666'
)
修改
方式1
models.UserInfo.objects.filter(id=1).update(
username='alexxx',
password='bigsb',
)
方式2
obj = models.UserInfo.objects.filter(id=1)[0]
obj.username = 'alex222'
obj.password = '11111'
obj.save()
批量创建
list_obj = []
for i in range(10):
obj = models.UserInfo(
username='xx%s'%i,
password='66%s'%i,
)
list_obj.append(obj)
print(list_obj)
models.UserInfo.objects.bulk_create(list_obj)
update_or_create
有就更新,没有就创建
需要注意的是,查找到的数据只能是没有或者只有一条。如果满足条件的数据不止一条,会报错。
a,b = models.UserInfo.objects.update_or_create(
username='alex',
defaults={
'id':20,
'password':'ooooo',
'age':84,
}
)
print(a) # 当前更新后的model对象,或者是你新增的记录的model对象
print(b) # 新增就是True,查询就False
删除
models.UserInfo.objects.filter(id=1).delete()
查询
简单查询
ret = models.UserInfo.objects.filter(id=1)
print(ret) #<QuerySet [<UserInfo: UserInfo object>]> -- []
obj = ret[0]
print(obj.id,obj.username)
查询方法
一共有13个方法,必知必会。今天先讨论其中三个:
all
ret = models.UserInfo.objects.all()
filter和get
ret = models.UserInfo.objects.get(age=18)
ret = models.UserInfo.objects.filter(age=180)
- get只能获取一条数据。如果超找不到数据或者查找到两条数据会报错,但是get请求返回的结果就是那个model对象:
# 1 UserInfo matching query does not exist. 啥也没查到
# 2 get() returned more than one UserInfo -- it returned 11! 结果多了,不行!
- fitler不会报错,返回结果是一个queryset类型的集合,里面是一个一个的model对象