• 第三阶段:Django框架 day55 Django--Django框架深入学习


    Django框架深入应用

    1. 前期回顾

    我们前期基于wsgiref、urls和views的映射关系简单介绍了web的框架,之后初步介绍了Django的使用。

    现在我们将真正用Django实现一个项目的功能框架,接下来,先简单介绍一下整体的框架。

    开始吧!

    2. 登录功能

    我们在完成一个完整的项目之前,首先通过实现单个功能认识整个项目的框架与各个文件的作用,比如登录功能。

    • 第一步 —— 创建Django项目

    • 第二步 —— urls.py文件建立关系

    • 第三步 —— views.py文件定义视图函数(某个功能)

    • 第四步 —— 项目名内的settings.py文件配置静态文件

      • 解析第一步:前三步是基本步骤,第四步因为登录功能需要区分浏览器的POST/GET命令,之后校验用户的用户名和密码,返回页面。
      • 解析第二步:返回的页面用到了redirect(重定向)render(request,'xx.html', {{'msg': ...}})命令。那么页面的css文件可以使用bootstrap,img等等,就需要配置静态文件。
    • 第五步 —— 用户信息与数据库校验与存放

      • 解析第一步:连接数据库,settings.py配置数据库(数据库文件迁移)
      • 解析第二步:Django自带小型sqlite数据库
    • 第六步 —— 利用models.py创建数据库表(相当于Django的orm)

      • 解析第一步:orm的优点我们已经知道,小白也可快速上手。但也有缺点,就是orm的封装性太好,使得使用效率降低。
      • 解析第二步:一个Django项目最好用一个数据库。
    • 第七步 —— 表字段及数据的增删查改

    2.1 创建Django项目

    • 命令行:django-admin startproject django项目名称
    • pycharm创建:new project ——>Django

    2.2 建立映射关系(urls.py)

    for example:

    urlpatterns = [    
        url(r'^admin/', admin.site.urls),                    
        url(r'^register/', views.register),           
        url(r'^login/', views.login),    
        url(r'^get_time/', views.get_time),    
        url(r'^get_user/', views.get_user),    
        url(r'^get_db/', views.get_db),
    ]
    

    2.3 定义视图函数(views.py)

    一一对应urls.py:

    def admin(request):
        pass
    
    def register(request):
        pass
    
    def login(request):
        pass
    
    def get_time(request):
        pass
    
    def get_user(request):
        pass
    
    def get_db(request):
        pass
    

    2.4 静态文件配置(settings.py)

    STATIC_URL = '/static/'  #接口访问密码,html导入静态文件样式的前缀
    STATICFILES_DIRS = (
        os.path.join(BASE_DIR, 'static'),  #静态文件夹的名字
    )
    

    2.5 数据库连接与校验(涉及render / redirect / HttpResponse)

    2.5.1 DATABASE配置

    第一步:settings.py

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'np1',
            'USER': 'root',
            'PASSWORD': '',
            'HOST': 'localhost',
            'PORT': '3306',
        }
    }
    

    第二步:__init__.py

    import pymysql
    pymysql.install_as_MySQLdb()
    

    注意一:原先的pymysql的另一种形式,在Django的settings.py里面有默认连接数据库配置。

    注意二:数据库的数据迁移 —— python manage.py dumpdata —— data.json(和migrations/migrate做区别)

    2.5.2 render/redirect/Httpresponse

    • redirect(重定向) —— 跳转页面
    • render(request,'xx.html', {{'msg': ...}}) —— 传递数据/网址/信息等
    • HttpResponse() —— 返回字符串

    注意:Django返回的都是HttpResponse的对象,因为这里的HttpResponse是一个类,上面三个默认继承这个类。

    2.6 Django的orm(models.py)

    第一步:Userinfo表

    class Userinfo(models.Model):
        username = models.CharField(max_length=64, null=True)
        password = models.IntegerField()
    

    注意:不创建库,只创建表。

    第二步:生成表单语句

    • 在命令行进行操作
      • python manage.py makemigrations —— 不会真正地操作数据,只是将记录放在migrations文件夹下
      • python manmge.py migrate —— 真正地将记录同步到数据库中

    注意一:每一次增删查改都要来一次
    注意二:第一次执行上面两条命令时,Django会创建很多表,里面有很多是默认的Django需要用的表。
    注意二:自己写的模型类对应的表,表名有固定格式,例如 “app01_userinfo” 。

    2.7 表单的增删改查

    2.7.1 增

    • 单条数据:

      • 方法一 : models.表名.objects.create(字段1=值1,字段2=值2........)

      • 方法二:dict = {'字段1':值,'字段2':值.........}

        models.表名.objects.create(dict)

    • 多条数据:

      info = [
           models.UserInfo(name='root1', age=34, ut_id=1),
           models.UserInfo(name='root2', age=35, ut_id=2),
           models.UserInfo(name='root3', age=36, ut_id=1),
           models.UserInfo(name='root4', age=37, ut_id=3),
           models.UserInfo(name='root5', age=32, ut_id=1),
      ]
      models.UserInfo.objects.bulk_create(info)
      

    2.7.2 删

    models.表名.objects.filter(满足的条件).delete()
    

    2.7.3 改

    models.表名.objects.filter(满足的条件).update(name='lll', age=23)
    

    2.7.4 查

    models.UserType.objects.all().values()   #表A的ud关联表b
    

    2.7.5 有子健关系的查询正向查询(通过A表中的ud查到表b的id)

    • 方法一:models.A.objects.all().values('ud__id')

    • 方法二:

      res = models.A.objects.all()
      for a in res:
          print(a.ud.id)
      

    2.7.6 有子健关系的查询返向查询(通过b表中的查到a表ID)

    • 方法一:models.B.objects.all().values('A__id')

    • 方法二:

      res = models.B.objects.all()
      for b in res:
          print(b.a_set.id) #### 表名小写_set
      

    2.8 表单的增删改查(2.0进阶)

    2.8.1 字段名过滤

    • filter —— 满足条件的
    • exclude —— 不满足条件

    用法:

    #id等于3的
    models.表名.objects.filter(id=3).values()
    
    #id不等于3的
    models.表名.objects.exclude(id=3).values()
    

    关于filter与exclude里面填写的参数

    • 等于: 字段名=值
    • 大于: 字段名__gt=值
    • 大于等于: 字段名__gte=值
    • 小于: 字段名__lt=值
    • 小于等于: 字段名__lte=值

    2.8.2 成员(in not in)

    res = models.表名.objects.filter(字段名__in=[2,4,5]) # where id in (2,4,5)
    res = models.表名.objects.exclude(字段名__in=[1,2]) # where id not in (1,2)
    

    2.8.3 区间(between...and)

    # where id between 4 and 8   [4,8]
    res = models.表名.objects.filter(字段名__range=[4,8])
    

    2.8.4 模糊查询(like)

    # where name like 'a%'
    res = models.表名.objects.filter(字段名__startswith="a")
    res = models.表名.objects.filter(字段名__istartswith="a") #忽略大小写
    
    # where name like '%a'
    res = models.表名.objects.filter(字段名__endswith="a")
    res = models.表名.objects.filter(字段名__iendswith="a") #忽略大小写
    
    # where name like '%a%'
    res = models.表名.objects.filter(字段名__contains="a")
    res = models.表名.objects.filter(字段名__icontains="a") #忽略大小写
    只要是i开头的基本上都是忽略大小写
    

    2.8.5 数据条数(count)

    # select count(*) from userinfo where id>3;
    # select count(id) from userinfo where id>3;
    #用sql语句查询数据条数尽量不要查count(*)查主键会快很多
    res = models.UserInfo.objects.filter(id__gt=3).count()
    

    2.8.6 排序(order by)

    #升序
    res = models.表名.objects.order_by('字段名称')
    
    #降序
    res = models.表名.objects.order_by('-字段名称')
    
    #多个条件进行排序
    res = models.表名.objects.order_by('字段1','字段2') #当字段1相同是会更具字段2进行排序
    

    2.8.7 分组(group by)| 已经(having)

    # select id, sum(age) as s, username from userinfo group by username
    from django.db.models import Count, Min, Max, Sum
    res = models.UserInfo.objects.values("name").annotate(s=Sum('age'))
    
    # select id, sum(age) as s, username from userinfo group by username having s > 50;
    res = models.UserInfo.objects.values("name").annotate(s=Sum('age')).filter(s__gt=50)
    

    2.8.8 分页(limit)

    # limit 1, 3 分页
    res = models.UserInfo.objects.all()[1:4]
    #因为获取对象是列表所有切片即可
    

    2.8.9 last/first

    第一条:res = models.表名.objects.first()

    最后一条:res = models.表名.objects.last()

    2.8.10 only|defer

    只查某个字段:only('字段名称')

    除某个字段以外的所有字段:defer('字段名')

    注意主键id不管怎么样都会查

    2.8.11 and|or

    只有and

    #id等于3and名字等于a
    models.表名.objects.filter(id=3,and name='a').values()
    

    只有or

    # Q
    from django.db.models import Q
    res = models.UserInfo.objects.filter(Q(id__gt=3) | Q(name='zekai')) #or用|链接
    

    有and和or

    # Q
    from django.db.models import Q
    res = models.UserInfo.objects.filter( Q(Q(id__gt=3) | Q(name='zekai')) & Q(age=23) ) #and用&链接
    

    2.8.12 F

    from django.db.models import F
    models.UserInfo.objects.update(name=F('name')+1) #字段名称都加1
    

    2.8.13 原生(sql)| 类似(pymysql)

    from django.db import connection, connections
    cursor = connection.cursor()  # cursor = connections['default'].cursor()
    cursor.execute("""SELECT * from auth_user where id = %s""", [1])
    row = cursor.fetchone()
    print(row)
    

    2.8.14 去重(distinct)

    models.UserInfo.objects.values("name", 'age').distinct() #前面values有多少个就对多少个值进行去除
    

    2.9 补充

    print(res.query) #查看上述代码生成的sql语句
    
  • 相关阅读:
    python3-基础11
    python3-基础10
    python3-基础9
    python3-基础8
    python3-基础7
    python3-基础6
    phaserjs 总结
    ES6总结
    移动端webview调试
    nodejs的理解
  • 原文地址:https://www.cnblogs.com/foreversun92/p/11723196.html
Copyright © 2020-2023  润新知