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路由分发

  1. 项目文件夹下的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/
]
  1. 在各个app应用文件夹下面创建urls.py文件,在urls.py文件中写自己应用的各个路径,比如app01app02
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'),
    ]
  1. 在各个应用中写各自的视图函数,当需要进行路径分发时,使用这样的格式:
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,对象关系映射

使用:

  1. 在应用文件夹下面的models.py文件中写对应的类,看下面的示例:
class UserInfo(models.Model):
    id = models.AutoField(primary_key=True)  
    username = models.CharField(max_length=10)
    password = models.CharField(max_length=32)
  1. 到mysql数据库中创建一个库,比如名为orm01:
create database orm01;
  1. 做数据库配置,默认使用的数据库是轻量的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'
    }
}
  1. 在项目文件夹下的的__init__.py文件中写上以下内容,来指定pymysql作为连接客户端
import pymysql
pymysql.install_as_MySQLdb()
  1. 执行数据库同步指令,在终端中执行
python manage.py makemigrations  #在migrations文件夹下面生成记录文件
python manage.py migrate         #执行记录文件

表就创建好了,我们的表名就是: 应用名_类名小写

在终端中,通过数据库命令就能看到我们刚刚建好的表了。

1574244736504

表中数据的增删改查

增加(创建)

方式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对象
原文地址:https://www.cnblogs.com/shuoliuchina/p/11900456.html