• 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对象
  • 相关阅读:
    《Metasploit 渗透测试魔鬼训练营》 攻击机无法攻击靶机
    Ubuntu 解压 RAR
    verilog实验2:基于FPGA的59秒计时器设计
    verilog实验1:基于FPGA蜂鸣器演奏乐曲并数码管显示
    Java基础之反射和动态代理
    Redis初探
    Rest(表述性状态转移)
    深入理解MVC模式
    @Controller和@RestController的区别
    solrconfig.xml和schema.xml说明
  • 原文地址:https://www.cnblogs.com/shuoliuchina/p/11900456.html
Copyright © 2020-2023  润新知